awk,sed是linux比较复杂的两个命令,在处理格式化的文件对我们有很大的帮助,最近,学习了这方面的知识,做了下总结。
1awk
语法: awk [-Ffield-separator] ‘ BEGIN{command1} pattern {command;} END{command2}‘ file
awk主要处理格式化的文件,读取文件的一行,分析该行,并通过分隔符获取到各个域位的值,然后通过pattern去匹配对应的行,匹配的上的话就执行command命令,其默认操作是打印出该行。对于命令中的BEGIN和END两个关键字,指明了在处理文本内容前和后,分别执行command1和command2处理操作。
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符
awk的典型用法:
1.匹配某一行:
awk‘/101/‘ file; 匹配带有101字符串的行
awk‘$1==5‘ file 匹配第一个域值为5的行
awk‘$1=="CT"‘ file 匹配第一个域值为“CT"的行
2 awk ‘BEGIN { FS="[: \t|]" }{print $1,$2,$3}‘
将分隔符设置为空格、:、TAB、|同时做为分隔符。
3 awk ‘$1 ~ /101/ {print $1}‘ file
将行中第一个域中含有101字符串的第一个域打印出来
4awk ‘BEGIN { max=100 ;print "max=" max} {max=($1 >max ?$1:max); print $1,"Now max is "max}‘ file
在command中可以定义命令行自己用的变量,在该例子中定义了变量max,在command使用该变量时,直接使用其变量名即可,后面的 max= ($1 >max ?$1:max); 很类似于C语言中的语法,当第一个域大于max时max是第一个域的值。
5awk ‘/tom/ {count++;} END {print "tom was found "count" times"}‘ file
END表示在所有输入行处理完后进行处理,统计
6awk ‘{ print FILENAME,$0 }‘ file1 file2 file3>fileall
把file1、file2、file3的文件内容全部写到fileall中,格式为打印文件并前置文件名。
7awk ‘ $1!=previous { close(previous); previous=$1 } {print substr($0,index($0," ") +1)>$1}‘ fileall
把合并后的文件重新分拆为3个文件。并与原文件一致。
8awk ‘BEGIN {"date"|getline d; print d}‘
将date命令得到的结果发送给getline,并将其打印出来
9ifconfig-a|grep vlan.|awk ‘{cmd="brctl delbr " $1; system(cmd);}‘
将系统中的vlan.x的桥接口删除掉
2sed
sed是一个文件处理工具,可以对文件的行进行操作,主要是对数据进行添加,删除,替换,选取等特定的工作,记住sed的操作不会对源文件产生影响,只是输出其处理后的结果,其命令行格式如下:
sed[-nefri] ‘command‘ 输入文本
-n:使用安静模式,只把处理的部分输出到屏幕上。
-i:直接修改读取的档案内容,而不是由屏幕输出。
常用命令:
a:新增,在新的一行添加一行字符串,for example:sed ‘1a drinktea‘ ab, sed ‘1,3a drink tea‘ ab
d:删除,删除一行或多行, for example: sed ‘1d‘ ab, sed ‘$d‘ ab删除最后一行。
p:显示某行,通常与-n共同使用,for example: sed -n ‘1p‘ ab, sed -n ‘2,$p‘ ab
c: 替换某一行,for example: sed ‘1,2c Hi‘ ab,将第1,2行替换为HI
s: 替换一行中的某部分,格式: sed ‘s/要替换的字符串/新的字符串/g‘ for example:
sed -n ‘/ruby/p‘ ab|sed‘s/ruby/bird/g‘