深入了解三剑客
深入了解三剑客
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