@Great-Chinese
2017-03-03T03:47:55.000000Z
字数 6120
阅读 894
Shell编程入门
A:命令历史
ls ~/.bash_history 查看root用户的命令历史所在路径echo $HISTSIZE!! 表示上一条命令!$ 上一条命令的最后一个参数!950 运行第950条的命令!c 从下向上看,命令以C开头的命令
B:Tab键 补全
C: 别名 alias
alias melody='cat a.txt'unalias melody 取消别名
D:通配符
ls *.txt 显示所有以.txt结束的文件ls 1* 显示所有以1开头的目录或文件ls ?.txt 匹配只有一个字符(单个数字,单个字母)
E:管道符 把一个命令的结果丢给另一个命令
cat /etc/passwd |wc -l
F:重定项
echo "melody0113" > a.txt 覆盖原文件(重定项)echo "melody0113" >> a.txt 追加wc -l < a.txt 反向重定项(把一个文件的内容丢给另一个命令)ls 1111 2> a.txt 错误重定项ls 1111 2>> a.txt 追加错误重定项
G:ctrl z 暂定
jobs 查看暂定的任务fg 调到前台运行bg 调到后台运行
A:系统变量
env 查看系统变量echo $HOSTNAME 查看一个变量的内容set 显示系统环境变量与自定义变量、额外的变量a=1; b=2echo $a $b
B:变量的规则
变量名由字母、下划线、数字组成,但不能以数字开头,避免用系统命令、关键字,大写字母做变量名。
a="ls /tmp",当变量内有特殊字符时需要使用双引号引起来,空格也是特殊字符。
myvim=`which vim`echo $myvim/usr/bin/vim
echo $als /tmpc="$a"12echo $cls /tmp12d=$myvim$aecho $d/usr/bin/vim ls /tmp
export a="ls /tmp" 全局申明bash 进入bash这个子shell中echo $a 显示变量ls /tmp
unset d #将之前定义的变量取消echo $a #这样就不显示值了
要想让变量无论在shell还是子shell都生效需要将变量加入vim /etc/profile
A:系统相关的配置文件
ls /etc/profile 查看profile文件vim /etc/profile 进入此文件vim /etc/profile.d/path.sh 重新定义一个SH文件source /etc/profile 让修改的/etc/profile生效echo $PATH
B:bashrc (定义$PS1即前缀,UMASK)
vim /etc/bashrcecho $PS1[\u@\h \W]\$PS1='[\u@\h \w]\$ ' 把W改成w,会显示绝对路径cd /etc/init.d/PS1='[\u@\h\t \w]\$ ' 加t显示时间PS1='[\u@\h-\t \w]\$ ' 加-在时间前面带-PS1='[\u@\h \W]\$ ' 返回到最初的状态ls /etc/bashrc 查看bashrc文件vim /etc/bashrc 进入此文件vim /etc/profile.d/umask.sh 重新定义一个SH文件source /etc/profile 让修改的/etc/profile生效
C:查看用户的家目录
ls -lavim.bash_profile 定义用户自己的环境变量vim.bashrc 定义用户的别名
?表示一位,文本中
\ 脱意符 ls #1.txt 改变#号原有含义
| 管道符 把前面的命令交给后面的处理
表示上条命令最后一个参数
;常用于两条命令中间,表示两条命令写一起
~ 代表用户家目录
& 把一个命令丢到后台,&& 把2个命令丢一起
*通配符, #注释本行
cut -d: -f 3 /etc/passwd (-d:分隔符, -f第几段)cut -d: -f 3-5 /etc/passwd (范围值3-5)cut -c 10 /etc/passwd 显示第10个字符,即截取字符
格式:sort /etc/passwd
-t 分隔符
-k 选择第几段
-n 使用纯数字排序(如果是字母的话,会把它看成0)
-r 反序排序,最小的在下面
-u 排序内容,但不去重复
-un 字母开头的会识别成重复内容,如skj1 a weotj 都会认为是重复内容,只显示数字内容
sort -t: -k3 /etc/passwd 以:为分隔符,按照第3段内容排序sort -t: -k3,5 /etc/passwd 以:为分隔符,显示3到5段的内容sort -t: -k3 -n /etc/passwd 以数字排序sort -t: -k3 -nr /etc/passwd 反序排序sort -u 2.txt == sort 2.txt |uniq
wc -l 计算一个文档的行数 可适用多个文件,会分别列出并计算总和wc -w 计算文档的单词个数wc -m 显示文档包含多少个字符,换行符也算一个符号
A: uniq去重复,还能计出有多少行重复
sort 2.txt |uniq -c 先排序,再去重复
如果只是有uniq -c选项则只会统计出两个连续相同数字,比较笨
B: tee重定向
echo "12345" > 1.txt 不显示信息在当前屏幕echo "123456" | tee 1.txt 把正确输出信息定向到一个文件中,并且在当前屏幕显示
A:tr 替换字符
ls *.txt 查看所有文件1.txt 1.txt 2.txt 3.txtls *.txt |tr 'a-z' 'A-Z' 把所有文件的小写字母替换成大写字母echo "adaladkwodjiwierjfdispaeijfidskeji" |tr 'a' 'A' 编辑一个文档,把文档内所有a字母替换成A字母echo "adaladkwodjiwierjfdispaeijfidskeji" |tr 'a-z' 'A-Z'echo "adaladkwodjiwierjfdispaeijfidskeji" |tr 'a-f' 'A-F'
B:split 切割大文件
split -b 100 1.txt 以文档大小来切割split -l 10 1.txt 以文档行数来切割wc -l anaconda-ks.cfg 查看文档行数du -sb anaconda-ks.cfg 查看文档大小split -b 30g anaconda-ks.cfg new_ 指定文件拆分后的文件名前缀
&& 左边命令执行成功后,才会执行右边的命令
|| 左边命令执行不成功,才会执行右边的命令
; 左边命令执行成功与否,后边命令都会执行成功
grep --color -n 'root' /etc/passwd 显示颜色与行数alias cg='grep --color'vim .bashrc 如果想永久的使用cg这个别名,就需要编辑此文件cg -c 'root' 1.txt 显示出现了几行cg -n 'root' 1.txt 显示行号cg -v 'root' 1.txt 取反,指显示不包含root的行cg -n -A 2 'root' 1.txt 显示下面2行cg -n -B 2 'games' 1.txt 显示下面2行cg -n -C 2 'games' 1.txt 上面,下面2行都显示cg -r 'iptables' /etc/* 显示所有目录和文件cg -rh 'iptables' /etc/* 只显示结果,前面的文件名不显示
cg '[0-9]' 1.txt 显示以数字开头的文件和目录cg '[a-zA-Z]' 1.txt 显示所有大小写字母cg -v '[a-zA-Z]' 1.txt 取反cg '^[a-z]' 1.txt 显示以小写字母开头的文件和目录cg '^[0-9]' 1.txt 显示以数字开头的文件和目录cg '[^0-9]' 1.txt 显示非数字开关的文件和目录cg '^[^0-9]' 1.txt 显示非数字开关的文件和目录,不可以是空行cg -v '^[0-9]' 1.txt 显示非数字开关的文件和目录,可以是空行cg '^$' 1.txt 显示空行cg -v '^$' 1.txt 显示空行之外的行cg 'r.o' 1.txt .表示任意的字符cg 'r*o' 1.txt *表示任意多个r都可以匹配,只要与o连在一起cg 'r.*o' 1.txt 表示任意多个任意字符cg 'r/?o' 1.txtcg -E 'r/?o' 1.txt
grep --color 'r\?o' 1.txt ==egrep -- 'r?o' 1.txtegrep --color 'r+o' 1.txtegrep --color 'root|nologin' 1.txt 或者grep --color 'root' 1.txt |grep --color 'nologin' 并且egrep --color '(rr)+' 1.txt 表示一个整体grep -E --color '(rr)+' 1.txtgrep -E --color '(rr){1,3}' 1.txt 指定次数grep -E --color '\(rr)\{1,3\}' 1.txt
. 表示任意一个字符
* 表示0个或多个前面的字符
. 表示任意个任意字符
? 表示0个或1个?前面的字符
+ 表示1个或多个+前面的字符
notes: ? + () {} | 这些符号需要脱意,egrep , -Egrep,sed 只可以使用'.' '*' '.*' 这三个符号,egrep,awk都可以使用'.' '*' '.*' '+' '?' 这五个符号
awk -F':' 'OFS="," {a[$7]=a[$7]+1};END {for(i in a)print i , a[i]}' 4.txt#打印第3段内容awk -F ':' '{print $3}' 1.txt#打印第3段,第4段内容awk -F ':' '{print $3,$4}' 1.txt#增加分隔符:,打印第3段,第4段内容awk -F ':' 'OFS=":"{print $3,$4}' 1.txt#匹配user,root行awk '/user|root/' 1.txtawk '/r*o/' 1.txtawk '/r?o/' 1.txtawk '/r+o/' 1.txtawk '/r.*o/' 1.txt#根据段匹配awk -F ':' '$1~/r*o/' 1.txt#精准匹配,精准打印awk -F ':' '$1~/r*o/ {print $3}' 1.txt#多次匹配,可加分号(两个规则,就会加印2次)awk -F ':' '$1~/r*o/ {print $1,$3}; $1~/nobody/ {print $1,$3}' 1.txt#一个规则,就只会打印1次awk -F ':' '$1~/r*o|nobody/ {print $1,$3}' 1.txt
#显示第一段为nobody的行awk -F ':' '$1=="nobody"' 1.txt#显示第一段为nobody的行,或者第7段包含nolog的awk -F ':' '$1=="nobody" || $7~/nolog/' 1.txt#第3段大于等于80的行,awk -F ':' '$3>=80' 1.txt#第7段不等于/sbin/nologin的行awk -F ':' '$7!="/sbin/nologin"' 1.txt#第7段不匹配/nolog/的行awk -F ':' '$7!~/nolog/' 1.txt#第3段小于第4段的行awk -F ':' '$3<$4' 1.txt#第3段等于第4段的行awk -F ':' '$3==$4' 1.txt
#打印前10行的值awk -F ':' 'NR<10' 1.txtawk -F ':' 'NR>10' 1.txtawk -F ':' 'NR==10' 1.txt#只打印第10行中第1段,第5段的值awk -F ':' 'NR==10 {print $1,$5}' 1.txtawk -F ':' '{if (NR==10) print $1,$5}' 1.txt#打印有多少段(7段)awk -F ':' '{print NF}' 1.txt#满足有7段的条件,并打印第1段awk -F ':' '{if (NF==7) print $1}' 1.txt#打印第1段,第7段awk -F ':' '{print $NR, $NF}' 1.txt#赋值,打印整行awk -F ':' 'OFS=":" {$7=$3+$4; print $0}' 1.txt#赋值,打印第1段,第3段awk -F ':' 'OFS=":" {$7=$3+$4; print $1,$3}' 1.txt#循环,所有的第3段相加,再求和awk -F ':' '{(sum=sum+$3)};END {print sum}' 1.txt
#只打印第10行的内容sed -n '10'p 1.txt#打印所有的行,到第10行时,再多打印一次sed '10'p 1.txt#指定范围,打印1-10行sed -n '1,10'p 1.txt#指定范围,打印10-未行sed -n '10,$'p 1.txt#指定范围,打印含有root的行sed -n '/root/'p 1.txtsed -n '/r.o/'p 1.txtsed -n '/r*o/'p 1.txtsed -n '/r+o/'p 1.txt#以下几种表达方式需要脱意sed -n '/r\?o/'p 1.txtsed -n '/r\+o/'p 1.txt#sed -n '/root\|nologin/'p 1.txtsed -n -r '/root|nologin/'p 1.txt#sed -n '/\(oo\)\+/'p 1.txtsed -r -n '/(oo)+/'p 1.txt#打印以非数字开头的sed -n -r '/[^0-9]/'p 1.txt#打印以非大小写字母开头的sed -n -r '/[^a-zA-Z]/'p 1.txt#显示空行sed -n -r '/^$/'p 1.txt# 删除空行sed '/^$/'d 1.txt#删除所有带大小写字母的行sed '/[a-zA-Z]/'d 1.txt#删除所有带数字的行sed '/[0-9]/'d 1.txt#删除1至19行,只是显示在屏幕上,原文件没有真正删除sed '1,19'd 1.txt#加 -i,会删除原文件,一般不建议用,会误删sed -i '1,19'd 1.txt
# 把1,10行dj替换成bjsed '1,10s/dj/bj/g' 1.txt# 把整行都替换成1212sed 's/^.*$/1212/g' 1.txt# 所有行的末尾都加上1212,并且1212前面有空格sed 's/^.*$/& 1212/g' 1.txt# 把所有行中的数字都删除sed 's/[0-9]//g' 1.txt ??????????????????如果带^,为什么结果不一样sed 's/[a-z,A-Z]//g' 1.txt
#时间同步命令ntpdate time.windows.com