sed管道命令及数据处理工具awk命令

sed管道命令工具:分析standard input,对比数据、替换c、删除d、新增a、插入i、选择

语法:
sed [-nefri] [动作]

-n:使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印
被 sed 特殊处理的行
-e:多重编辑,且命令顺序会影响结果
-f:直接将sed的动作写在一个文件中,然后-f filename则可执行filename内的sed动作
-r:Sed 使用扩展正则,默认是基础正则表达式语法
-i:直接修改文档读取的内容,不在屏幕上输出

动作说明:[n1[,n2]]function
n1,n2:不见得会存在,一般代表选择进行动作的行数。如在10-20行内,则10,20[动作]

function有下面参数:
a    在当前行后添加一行或多行
c    用新文本修改(替换)当前行中的文本
d    删除行
i    在当前行之前插入文本
p    打印行
s    用一个字符串替换另一个,例如:1,20s/old/new/g(在1-20行内用new替换old单词)

举例:
删除
nl /etc/passwd | sed '2,5d'

新增
nl /etc/passwd | sed '2a drink tea'

行替换
nl /etc/passwd | sed '2,5c No 2-5 number'

显示
nl /etc/passwd | sed -n '5,7p'

替换字符
nl /etc/passwd | sed 's/要被替换的字符串/新字符/g'

好用的数据处理工具awk
相比于sed常常作用于一整行的处理,awk则比较顷向于将一行分成一个“字段”来处理。

awk语法:
awk ‘条件类型1{动作1}条件类型2{动作2}...’ filename

awk可以处理后续接的文件,也可以读取来自前个命令的standardoutput。但awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键和\t键。

要让awk知道这个数据有几行几例,需要awk内置变量的辅助:
NF    每一行($0)拥有的字段总数   ($0代表一整行数据,$1代表每一行的第一个字段,$n代表每行的第n个字段)
NR    目前awk所处理的是第几行数据
FS    目前的分隔符,默认是空格键


举例1:
获取/etc/passwd中前三列数据且第三列小于10以下的数据
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'
改进:
cat /etc/passwd | 'begin awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'


举例2:
pay.txt内容如下:
Name    1st        2nd        3th
VBird    23000    24000    25000
DMTsai    21000    20000    23000
liang    43000    42000    41000
输出要求:第一行只是说明,所以第一行不要进行加总(NR=1时处理);
第二行以后就会有加总的情况出现(NR>=2以后要处理)
cat pay.txt | awk 'NR=1{print "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,$5,"Total"}
NR>=2{total=$2+$3+$4; print "%10s %10d %10d %10d %10d",$1,$2,$3,$4,total}'
针对第个举例进行说明:
i、所有awk的动作,即在{}内的动作,如果有需要多个命令辅助时,可利用分号“;”间隔,或者直接以[enter]按键来隔开每个命令
ii、逻辑运算当中,如果是“等于”的情况,则务必使用两个等号“==”
iii、格式化输出时,在printf的格式设置当中,务必加上\n,才能进行分行!
iv、与bash、shell的变量不同,在awk当中,变量可以直接使用,不需加上$符号

猜你喜欢

转载自blog.csdn.net/TT_love9527/article/details/81485340