深入了解三剑客

grep、awk、sed


 

grep命令

grep为三剑客之首,主要用于筛选、过滤。

显示文件中含有某个字符或字符串的行。

[root@oldboyedu50 data]# grep "oldboy" /data/test.txt

grep “筛选内容” 目录

显示文件中除某个字符或字符串的行。

[root@oldboyedu50 data]# grep -v "oldboy" /data/test.txt

不显示行(空格行和空白行) 

egrep -v '^$|^ +$' lidao.txt 
grep -v “筛选内容” 目录

选项:

geep: 
-v:取反 
-n:显示行号 
-E:扩展正则 
-o:连接符,有并且的意思 
-i:不区分大小写 
-l:过滤的时候只显示文件名字 
find+grep 
-A2:after 显示你要找的行以及接下来的两行 
-B2:显示你要找的行以及上面两行 
-C2:显示你要找的行以及上下各两行 
–color:匹配内容高亮显示 
–include: 指定匹配的文件类型 
–exclude: 过滤不需要匹配的文件类型


 

awk命令

三剑客之一,擅长取列。

选取含有某个字符或字符串的行。

[root@oldboyedu50 data]# awk '/oldboy/' /data/test.txt

awk ‘/字符串/’ 目录

选取不含有某个字符或字符串的行。

[root@oldboyedu50 data]# awk '!/oldboy/' /data/test.txt

awk ‘!/字符串/’ 目录

在passwd.txt中,将用户与shell解释器调换位置

awk -F: -vOFS=: '{print $NF,$2,$3,$4,$5,$6,$1}' passwd.txt
awk -F: -vOFS=: '{tmp=$1;$1=$NF;$NF=tmp;print}' passwd.txt

 

正则表达式

在oldboy.txt中,查找文件第三列列中包含数字4的行

awk ‘$3~/4/’ oldboy.txt

 

查找文件第三列中以某个字符开头的行

awk '$3~/^4/' /server/files/reg.txt

 

显示有某一特征的行的其他列

awk '$2~/Xiaoyu/{print $1,$3}' reg.txt

 

显示某列以某个字符串开头的行的其他列

awk '$3~/^41/{print $1,$2,$3}' reg.txt

 

补充:

1、awk的默认动作是输出所有列 
2、awk默认过滤 
‘/oldboy/’ ‘0!~/oldboy/’

显示文件某列包含某两个字符其中一个的行的其他列

awk '$3~/5$|1$/{print $1,$2}' reg.txt 
awk '$3~/[15]$/{print $1,$2}' reg.txt

 

显示xiaoyu的捐款,每个值时都有以开头,如520135(替换单个字符并显示)

awk '$2~/Xiaoyu/{gsub(/:/,"$");print}' reg.txt

 

awk添加字符,显示想要的格式。

awk -vOFS=, '{print $1,$2}' reg.txt 
awk '{print $1","$2}' reg.txt

 

比较表达式

格式:

‘条件 {动作}’

选项

-F 定义分隔符 
-v 定义变量

awk内置变量

NR 行号 number of record 
NF 每行有多少列 number of filed 
FS 指定的分隔符 -F: ==== -vFS=: 
OFS output 输出分隔符 显示每一列的时候 每一列之间通过什么分开 
RS 以点(.)为记录分隔符,显示行号与文件内容针对行

awk 内置命令(函数)

gsub (//,””,某一列) 
gsub (/找谁/,”替换为谁”,某一列) 
gsub (/找谁/,”替换为什么”)====gsub (/找谁/,”替换为谁”,$0)\


 

sed命令

斜体文本三剑客之一,擅长过滤和取行。* 
sed命令执行过程 
1.读取文件内容第1行 
2.是否满足条件 
1).满足条件 执行对应的命令 
2).不满足 继续第1步 
3.截止到文件的最后一行

显示:

显示文件的第5行 

sed -n 5p person.txt 

显示文件的第三行到最后一行 

sed -n '3,$p' person.txt 

显示文件中包含oldboy的行 

sed -n '/oldboy/p' person.txt 
sed '/oldboy/d' person.txt

显示文件的第1和4行和5行 

sed -n '1p ;4p; 5p' person.txt

显示 有规律的行 

seq 10 |sed -n '1~2p' 

显示文件的某个字符串的行及前两行 

sed -n '/Alex/,+2p' person.txt 
grep -A2 person.txt

 

增加

c 替换 
a 追加到某行下一行 
i 插入某行的上一行 
追加到文件末尾 

sed '$a12306,xiao,UFO\n12580,tao,XO' person.txt 

追加到文件第三行 

sed '3c12306,xiao,UFO' person.txt 

sed ‘数字c要添加的内容’ 文件

删除

删除第二行到第五行 

sed -n '2,5p' person.txt 

删除从某个字符串开始的行 

sed '/yy/,$d' person.txt

 删除不包含某个字符串的行 

sed '/lidao/!d' person.txt

 

企业案例:不显示文件中的空行

grep -v '^$' lidao.txt 
sed '/^$/d' lidao.txt 
awk '!/^$/' lidao.txt 
sed -n '/^$/!p' lidao.txt

 

替换

将文件中出现的字符串统一修改。 

sed 's#oldboy#oldgirl#g' t.sh

sed ‘s#将要修改的内容#修给为什么#g’ 目录 

将文件中的数字替换为空 

sed 's#[0-9]##g' person.txt 

修改文件并备份 

sed -i.bak 's#girl#boy#g' t.sh 

-i.bak 先备份文件 t.sh.bak 然后修改文件内容 

后项引用 

ifconfig eth0 |sed -rn '2s#^.*r:(.*) Bc.*#\1#gp'

 

提取IP

[root@oldboyedu50-lnb ~]# ifconfig eth0 |sed -rn '2s#^.*r:(.*) Bc.*#\1#gp'
10.0.0.200 
[root@oldboyedu50-lnb ~]# ifconfig eth0 |awk -F'[ :]+' 'NR==2{print $4}'
10.0.0.200 
[root@oldboyedu50-lnb ~]# ifconfig eth0 |awk -F'addr:| Bc' 'NR==2{print $2}'
10.0.0.200 
[root@oldboyedu50-lnb ~]# ifconfig eth0 |awk -F'[^0-9.]+' 'NR==2{print $2}'
10.0.0.200

 

批量重命名:删除文件名中的html_

touch oldboy_html_{01..10}.jpg

 方法一: 

[root@oldboyedu50-lnb ~]# ls *|sed -r 's#(^.*y_)(.*_)(.*$)#\1\3#g'

方法二: 

[root@oldboyedu50-lnb ~]# for i in {01..10}; do echo "mv oldboy_html_$i.jpg oldboy_$i.jpg"; done

方法三: 

[root@oldboyedu50-lnb ~]# rename oldboy oldgirl *.jpg

找谁 替换为什么 替换哪些文件

显示不是以空格开头的行

awk '!/[[:space:]]/' person.txt 
sed -r '/[[:space:]]/d' person.txt 
sed -nr '/[[:space:]]/!p' person.txt

选项、参数

-n:只打印模式匹配的行 
-e:直接在命令行模式上进行sed动作编辑,此为默认选项 
-f:将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作 
-r:支持扩展表达式 
-i:直接修改文件内容


 

活学活用

显示文件20-30行的内容。

方法一:
[root@oldboyedu50 data]# head -30 /data/ett.txt |tail -11

方法二:

[root@oldboyedu50 data]# sed -n '20,30p' /data/ett.txt

方法三:

[root@oldboyedu50 data]# awk 'NR==20,NR==30' /data/ett.txt

 

版权声明:本文为jason-ma原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jason-ma/p/9550376.html