awk+grep+sed使用命令

文本处理器awk使用方法

1:awk常见用法

$0           表示整个当前行
$1           每行第一个字段
NF          字段数量变量
NR          每行的记录号,多文件记录递增
FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始
\t            制表符
\n           换行符
FS          BEGIN时定义分隔符
RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~            匹配,与==相比不是精确比较
!~           不匹配,不精确比较
==         等于,必须全部相等,精确比较
!=           不等于,精确比较
&&      逻辑与
||             逻辑或
+            匹配时表示1个或1个以上
/[0-9][0-9]+/   两个或两个以上数字
/[0-9][0-9]*/    一个或一个以上数字
FILENAME 文件名
OFS      输出字段分隔符, 默认也是空格,可以改为制表符等
ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]'   定义三个分隔符

2:awk案例

(1)按行输出文本
awk -F":" '{print}' /etc/passwd					//输出所有
awk -F":" '{print $0}' /etc/passwd					//输出所有
awk -F: 'NR==3,NR==6{print}' /etc/passwd		 //显示第3行到第6行
awk -F: 'NR>=3&&NR<=6{print}' /etc/passwd       //显示第3行到第6行
awk -F: 'NR==3||NR==6{print}' /etc/passwd       //显示第3行和第6行
awk '(NR%2)==1{print}' /etc/passwd			//显示奇数行
awk '(NR%2)==0{print}' /etc/passwd			//显示偶数行
awk '/^root/{print}' /etc/passwd				//显示以root开头的行
awk '/nologin$/{print}' /etc/passwd		//显示以nologin结尾的行
awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd      //统计以/bin/bash结尾的行数
awk 'BEGIN{RS=""};END{print NR}' /etc/ssh/sshd_config 		//统计以空行分隔的文本段落数

awk '{print NR,$0}' /etc/passwd                                 //输出每行的行号
awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd      //依次打印行号,字段数,最后字段值,制表符,每行内容
awk -F: 'NR==5{print}'  /etc/passwd                         //显示第5行
route -n|awk 'NR!=1{print}'                                       //不显示第一行

awk -F: '{print NF}' /etc/passwd                                //显示每行有多少字段
awk -F: '{print $NF}' /etc/passwd                              //将每行第NF个字段的值打印出来
 awk -F: 'NF==4 {print }' /etc/passwd                       //显示只有4个字段的行
awk -F: 'NF>2{print $0}' /etc/passwd                       //显示每行字段数量大于2的行

3:按字段输出文本

awk -F":" '{print $3}' /etc/passwd		//显示第三列
awk -F":" '{print $1 $3}' /etc/passwd                       //$1$3相连输出,无空格,
awk -F":" '{print $1,$3}' /etc/passwd                       //多了一个逗号,输出第1和第3个字段,有空格
awk -F: '$2=="!!" {print}' /etc/shadow			//统计密码为空的shadow记录
awk 'BEGIN {FS=":"}; $2=="!!" {print}' /etc/shadow		##显示密码为空的用户的shadow信息
awk -F ":" '$7~"/bash" {print $1}' /etc/passwd		##显示第七个字段为/bash的行的第一个字段
awk -F: 'NR==5{print}' /etc/passwd                         //显示第5行
awk -F":" '{print $1 " " $3}' /etc/passwd                  //$1$3之间手动添加空格分隔



(3)通过管道、双引号调用shell命令
awk -F: '/bash$/{print | "wc -l"}' /etc/passwd     ##统计bash用户的个数
awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'   ##统计在线用户的数量
awk 'BEGIN {"hostname" | getline;print $0}'      ##输出当前主机名


awk -F: '$1~/mail/ && $3>6 {print }' /etc/passwd         //逻辑与,$1匹配mail,并且$3>6
awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd  
awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd       //逻辑或,统计以mail开头或第3列大于1000的行
awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd 


二:正则表达式grep

-a 不要忽略二进制数据。
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。-e<范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。

(1)查看以the为行首的行

[root@localhost ~]# grep -n '^the' test.txt

(2)查询以小写字母开头的行

[root@localhost ~]# grep -n '^[a-z]' test.txt

(3)查询以大写字母开头的行

[root@localhost ~]# grep -n '^[A-Z]' test.txt 

(4)查看以非字母开头的行

[root@localhost ~]# grep -n '^[^a-zA-Z]' test.txt 

(5)查看以点结尾的行

[root@localhost ~]# grep -n '\.$' test.txt 

(6)查询空行

[root@localhost ~]# grep -n '^$' test.txt 
注释:查询非空行
[root@localhost ~]# grep -n -v '^$' test.txt 

(2)w开头,d结尾中间有2–5个o

[root@localhost ~]# grep -n 'wo\{2,5\}d' test.txt 

(3)w开头,d结尾中间有2个以上o

[root@localhost ~]# grep -n 'wo\{2,\}d' test.txt 

二:文本处理器sed

1:sed常用选项

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
 -e :直接在命令列模式上进行 sed 的动作编辑;
 -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
 -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
 -i :直接修改读取的文件内容,而不是输出到终端。

 

2:sed常用操作

a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
 c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
 d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
 i :插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)

(1)输出所有内容
[root@localhost ~]# sed -n 'p' test.txt 
1. sed  -i '/preSql/d' a.txt**
*---删除匹配到**preSql的行***
2. sed -i '1d' a.txt**
*---删除第一行
3. sed -i '3~2d' a.txt**
*---从第三行开始,每隔一行删除*
4. sed -i '4,8d' a.txt**
*---删除从第4行到第8行
5. sed -i '$d' a.txt
*---删除最后一行
6. sed '/^$/d' a.txt**
*---删除所有空行
7. sed -i '/Website Design/,$d' a.txt**
*---从匹配行到末尾行*
8. sed -i '/Storage/,+2d' a.txt**
---*删除匹配行和之后两行

1:输出符合条件的文本

(1)输出所有内容
[root@localhost ~]# sed -n 'p' test.txt 
(2)输出第三行
[root@localhost ~]# sed -n '3p' test.txt 
(3)输出3~5行
[root@localhost ~]# sed -n '3,5p' test.txt 
(4)输出所有奇数行
[root@localhost ~]# sed -n 'p;n' test.txt 
(5)输出所有偶数行
[root@localhost ~]# sed -n 'n;p' test.txt 
(6)输出第1~5行之间的奇数行
[root@localhost ~]# sed -n '1,5{p;n}' test.txt 
(7)输出第10行至文件尾之间的偶数行
[root@localhost ~]# sed -n '10,${n;p}' test.txt 
注释:
此命令中,读取的第一行是文件的第10行,读取的第二行,是文件的第11行,依次类推
(8)输出包含the的行
[root@localhost ~]# sed -n '/the/p' test.txt 
(9)输出从第4行开始至第一个包含the的行
[root@localhost ~]# sed -n ' 4,/the/p' test.txt 
(10)输出包含the的行所在的行号
[root@localhost ~]# sed -n '/the/=' test.txt 
注释:=用来输出行号
(11)输出以PI开头的行
[root@localhost ~]# sed -n '/^PI/p' test.txt 
(12)输出包含单词wood的行
[root@localhost ~]# sed -n '/\<wood\>/p' test.txt 

2:删除符合条件的文本

(1)删除第3行
[root@localhost ~]# nl test.txt | sed '3d'		##显示行号[root@localhost ~]# sed '3d' test.txt		##不显示行号
(2)删除3~5行
[root@localhost ~]# nl test.txt |sed '3,5d'
(3)删除包含cross的行
[root@localhost ~]# nl test.txt |sed '/cross/d'
注释:删除不包含cross的行
[root@localhost ~]# nl test.txt |sed '/cross/! d'
(4)删除以小写字母开头的行
[root@localhost ~]# sed '/^[a-z]/d' test.txt 
(5)删除以点结尾的行
[root@localhost ~]# sed '/\.$/d' test.txt 
(6)删除空行
[root@localhost ~]# sed '/^$/d' test.txt 

3:替换符合条件的文本

(1)将每行的第一个the换成THE
[root@localhost ~]# sed 's/the/THE/' test.txt 
(2)将每行中的第2个l换成L
[root@localhost ~]# sed 's/l/L/2' test.txt 
(3)将文中所有的the换成THE
[root@localhost ~]# sed 's/the/THE/g' test.txt 
(4)将文中所有的o删除
[root@localhost ~]# sed 's/o//g' test.txt 
(5)在每行的行首插入#
[root@localhost ~]# sed 's/^/#/' test.txt 
注释:在每行行尾添加#
[root@localhost ~]# sed 's/$/#/' test.txt 
(6)在包含the的每行的行首插入#
[root@localhost ~]# sed '/the/s/^/#/' test.txt 
(7)在每行的行尾插入字符串EOF
[root@localhost ~]# sed 's/$/EOF/' test.txt
(8)将第3~5行中的所有the替换成THE
[root@localhost ~]# sed '3,5s/the/THE/g' test.txt 
(9)将包含the的所有行中的o都替换成O
[root@localhost ~]# sed '/the/s/o/O/g' test.txt 

4:迁移符合条件的文本

H:复制到剪切板
g:将剪切板中的内容覆盖到指定行
G:将剪切板中的内容追加到指定行
w:保存文件
r:读取指定文件
a:追加指定内容

(1)将包含the的行迁移至文件的末尾
[root@localhost ~]# sed '/the/{H;d};$G' test.txt 
(2)将第1~5行的内容转移至第17行后
[root@localhost ~]# sed '1,5{H;d};17G' test.txt 
(3)将包含the的行另存为文件out.txt
[root@localhost ~]# sed '/the/w out.txt' test.txt 
(4)将文件/etc/hostname的内容添加到包含the的每一行后
[root@localhost ~]# sed '/the/r /etc/hostname' test.txt 
(5)在第3行后插入一个新行,内容为#chkconfig:35 82 20
[root@localhost ~]# sed '3a#chkconfig:35 82 20' test.txt 
(6)在包含the的每行后插入一个新行,内容为New
[root@localhost ~]# sed '/the/aNew' test.txt 
(7)在第3行后插入多行内容
[root@localhost ~]# sed '3aNew1\nNew2' test.txt	
注释:\n为换行,添加两行为New1和New2

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值