shell日常要点


  1. 学习提示 > 学习shell主要在于用,光看书没用
  2. 单引号、双引号、括号、花括号及反引号
单引号内所有元字符都失去特殊含义(包括)双引号内除了变量域($)和命令域(`)以外的元字符都失去特殊含义,所以一般使用双引号引用
花括号{}被用来区分变量名和周围的文本:echo ${file} and $file1 寻找变量file,file1
命令替代的格式:反引号来环绕一个命令象` cmd `,它和$(command) 是等价的:ls -l `find . -type f`
  1. 取行
sed -n "3"p file 取第3行
sed -n "1,3"p file 取第1到3行
sed -n "1,$"p file 取第1到最后一行
sed -n "1,$num"p file 取第1到num行
sed -n "$p" file 取最后1行
sed -e '1!G;h;$!d' file倒过来显示
  1. sed 附加/替换:
sed "/xmdh/adaoyou" file 把含有xmdh的行的结尾附加daoyou(有换行)
sed 's/$/ daoyou/' file把每行的结尾附加daoyou(在同一行)
sed '/test/s/$/ daoyou/' file把包含test行的结尾附加daoyou(在同一行)
sed '10s/$/ daoyou/' file把第10行的结尾附加daoyou(在同一行)

sed "s/xmdh/daoyou/g" file把xmdh替换成daoyou
sed  "s/xmdh/daoyou/;G"  file把xmdh替换成daoyou并增加一个换行
cat userlog |sed -n '/xmdh/ w test.txt'查看含有xmdh并写入test.txt中
  1. 搜索:
vi file 后://
  1. 显示行号:
awk '/dhshunde/{print NR,$0}' userlog或grep -n dhshunde userlog 显示含有dhshunde的行号及内容
cat userlog |sed -n ‘/erptest/=’ 显示含有erptest的行号
cat userlog |sed -n '/xmdh/p'|sed -n '$p' 显示包含xmdh的最后一行
  1. awk中使用变量
/bin/cat /etc/ppp/chap-secrets|grep $5|awk '{print logouttime"t","username:"$1"t","logout""t","data:"datasize}' logouttime="`/bin/date`"datasize="$size" >>$pptplogdirectory/userlog(注:size前面已经有定义)
  1. 向登录终端用户发送消息
echo "hello I am jiangdaoyou"|tee /dev/pts/2 (tty可以查看自已的终端号),等同于:write root pts/2然后输入:hello I am jiangdaoyou然后Ctrl+D结束
  1. awk之BEGIN和END
即在文件头增加列名:
cat userlog |awk 'BEGIN{print "Time usernamen-----------------"};{print $4,$7}'
Time     username
------------------------------
15:19:28 username:xmdh
15:20:00 username:xmdh
将在上面的基础上增加结尾说明“end of report!!!!”
cat userlog |awk 'BEGIN{print "Time     usernamen-----------------"}{print $4,$7}END{print "end of report!!!!"}'
返回首页
  1. 截取/转化字符
echo "200604211031"|cut -c9-12 得到1031
cat test.ok |tr 'arp' 'rpm' 把arp转为rpm
  1. 求平均值
vmstat 1 4|awk '{print $4}'|grep -o '[0-9]*'|sed 's/,//g' |awk '{total=total+$1;if(NR%4= =0) {print total/4}}'或如下方法:
vmstat 1 4|awk 'NR>2{sum+=$4}END{print sum/4}'
  1. 循环
ls |for file in *;do echo "rpm -ivh" $file;done
ls |for file in $(ls *.rpm);do echo "rpm -ivh" $file;done