linux基础之三剑客-grep/sed/awk

linux三剑客

grep : 过滤文本
sed : 修改本文
awk : 处理文本

1、linux三剑客之grep

grep是linux的三剑客之一,是一种文本过滤器。即根据文本过滤文件。比如想过滤某个网站里面有多少root,就需要用到grep来进行过滤。

# 知识储备:
    $? : 上一行命令执行的结果,0代表执行成功,其他数字代表执行失败。
    wc :  匹配行数
    -l : 打印匹配行数
    -c : 打印匹配的字节数

1.1、grep 语法格式

grep 参数 匹配规则 操作对象
	匹配的是文本内部的内容,不是过滤文件或者属性的。
	操作对象:比如要过滤哪部分文件,这部分文件就是操作对象

1.2、grep参数

1.2.1 参数 -n

-n : 过滤文本时,将过滤出来的内容在文件内的行号显示出来
  [root@localhost ~]# grep -n 'root' /etc/passwd

image

1.2.2 参数 -A

-A 数字n: 匹配成功之后,将匹配行的后n行显示出来
  [root@localhost ~]# grep -A 2 'shutdown' /etc/passwd

image

1.2.3 参数 -B

-B 数字n: 匹配成功之后,将匹配行的前n行显示出来
  [root@localhost ~]# grep -B 2 'shutdown' /etc/passwd

image

1.2.4 参数 -C

-C 数字n : 匹配成功之后,将匹配行的前后各n行显示出来
  [root@localhost ~]# grep -C 2 'shutdown' /etc/passwd

image

1.2.5 参数 -c

-c :  显示匹配成功的有多少行
  [root@localhost ~]# grep -c 'shutdown' /etc/passwd

image

1.2.6 参数 -o

-o :  只显示匹配成功的内容
  [root@localhost ~]# grep -o 'shutdown' /etc/passwd

image

1.2.7 参数 -v

-v :  反向过滤
  [root@localhost ~]# grep -v '/bin/bash' /etc/passwd

image

1.2.7 参数 -q

-q :  静默输出(经常用在脚本里面),即过滤出来的内容不显示。通过执行命令 echo $? 来判断是否匹配到内容,如果为0则匹配到了,如果为其他数字则没有匹配到。
  [root@localhost ~]# grep -q 'hr' /etc/passwd
  [root@localhost ~]# echo $?

image

1.2.8 参数 -i

-i : 忽略大小写
  [root@localhost ~]# grep -i 'hr' /etc/passwd

image

1.2.9 参数 -l

-l :  匹配成功之后,将文本的文件名称打印出来
  [root@localhost ~]# grep -l 'hr' /etc/passwd

image

1.2.10 参数 -R/-r

-R|-r : 递归匹配
    在/etc目录下,包含root的内容。
  	[root@localhost ~]# grep -r 'root' /etc/
    在/etc目录下,包含root内容的文件。
  	[root@localhost ~]# grep -rl 'root' /etc/ 
    在/etc目录下,包含root内容的文件数量。
  	[root@localhost ~]# grep -rl 'root' /etc/ | wc -l

# 知识储备:
    $? : 上一行命令执行的结果,0代表执行成功,其他数字代表执行失败。
    wc :  匹配行数
        -l : 打印匹配行数
        -c : 打印匹配的字节数

image

image

1.2.11 参数 -E

-E : 使用拓展正则,grep -E 可以写成 egrep
  [root@localhost ~]# grep -E '\ +' ./2.txt

image

2、linux三剑客之sed

sed是linux的三剑客之一,是一种流媒体编辑器。主要用来编辑一个或多个文件,简化对文件的反复操作、编写程序等。

2.1、sed 语法格式

sed 参数 '处理规则' 操作对象 : 注意规则必须是加单引号

2.2、参数

2.2.1 参数 -e

-e :允许多项编辑
  [root@localhost ~]# sed  -e '1d' -e '3d' 2.txt :删除文件1.txt的第1,3行

image

2.2.2 参数 -n

-n : 取消默认输出(不显示内容)
  [root@localhost ~]# sed -e '1d' -n 2.txt :删除第一行后不输出内容
  [root@localhost ~]# sed -n '5p' 2.txt :p模式默认全部输出,取消默认输出则只输出第5行

image

2.2.3 参数 -i

-i : 就地编辑:把展示的内容直接写入
  [root@localhost ~]# sed -i '1p' 1.txt

image

2.2.4 参数 -r

-r : 支持拓展正则,跟grep的-E一样的,正则表达式在两个//里面
  [root@localhost ~]# sed -r '/456/d' 2.txt

image

2.2.5 参数 -f

-f : 指定sed的匹配规则脚本文件:匹配规则可以写到脚本里面
  [root@localhost ~]# sed -f 3.txt 2.txt

image

2.3、定位

2.3.1 数字定位法

指定行号:
  [root@localhost ~]# sed '3d' 2.txt 
  [root@localhost ~]# sed '2,3d' 2.txt 

image

2.3.2 正则定位法

指定正则定位:
  [root@localhost ~]# sed '/^2/d' 4.txt

image

2.3.3 数字和正则定位法

指定行号和正则定位
  [root@localhost ~]# sed '2,/^4/d' 4.txt :把从第3行到以4开头的行删除

image

2.3.4 正则正则定位法

  [root@localhost ~]# sed '/^2/,/^4/d' 4.txt :把从2开头的行到4开头的行删除

image

2.4、 sed 编辑模式

2.4.1 模式d

d : 删除
  [root@localhost ~]# sed '3d' 2.txt 

2.4.2 模式p

p : 打印
  [root@localhost ~]# sed -n '5p' 2.txt

2.4.3 模式a

a :在当前行的后面添加一行或多行内容
  [root@localhost ~]# sed -e '2aqwe' -e '3apoi' 4.txt

image

2.4.3 模式c

c : 修改当前行
  [root@localhost ~]# sed '2cxxx' 4.txt

image

2.4.4 模式i

用法1:在当前行之前插入文本(在处理规则中)
  [root@localhost ~]# sed '2ixxx' 4.txt
用法2:作为参数使用的时候是忽略大小写的意思

image

image

2.4.4 模式r

r : 在读一个指定文件然后把内容插入到操作对象里面
  [root@localhost ~]# sed '2r 3.txt' 4.txt

image

2.4.5 模式w

w : 把操作文件的指定行写入指定文件
  [root@localhost ~]# sed '2w 3.txt' 4.txt:把4.txt 的第二行写入3.txt

image

2.4.6 模式y

y : 把字符转换成另一个字符(不是字符串)
  [root@localhost ~]# sed '4y/45/78/' 4.txt

image

2.4.7 模式s

把字符串转换成另一个字符串
这个s跟其他参数都不一样,需要放前面
s模式有个特性:每一行只替换一次;跟着g配合使用可以替换整行
  [root@localhost ~]# sed 's/11/22/' 4.txt

image

2.4.8 模式g

g : 全部执行,可以理解为应用到整行。
  [root@localhost ~]# sed 's/11/22/g' 4.txt

image

2.4.9 模式&

& : 代表前面匹配到的所有内容,相当于一个变量
  [root@localhost ~]# sed 's/.*/# &/g' 4.txt

image

2.5、练习题

2.5.1 练习题1 :将nginx.conf中的注释行全部去掉

  [root@localhost ~]# sed '/^ *#/d' /etc/nginx/nginx.conf

2.5.2 练习题2 :给nginx.conf中的每一行添加注释

  [root@localhost ~]# sed 's/.*/# &/g' /etc/nginx/nginx.conf

2.5.3 练习题3 :要求一键修改本机IP

ip1改成: 192.168.15.101
ip2改成: 172.16.1.101
  [root@localhost ~]# sed -i 's#\.100#\.101#g' /etc/sysconfig/network-scripts/ifcfg-ens3[23]

2.5.4 练习题4 :把/etc/passwd下面的root改成ROOT

  [root@localhost ~]# sed -i 's#root#ROOT#g' /etc/passwd

3、linux三剑客之awk

awk主要是用来格式化文本的。

3.1、awk的语法

awk 参数 处理规则 操作对象

3.2、参数

3.2.1 参数-F

参数 -F :指定本文分隔符(默认以空格作为分隔符)
  [root@localhost ~]# awk -F'/' '{print $NF}' 2.txt :用/作为分隔符,打印最后一列字段

	# 案例:打印系统所有用户的解析器:冒号作为分隔符,最后一个字段就是解析器
  [root@localhost ~]# awk -F: '{print $NF}' /etc/passwd

image

3.3、awk的生命周期

grep、sed、awk都是读一行处理一行,直到处理完成。
1.接收一行作为输入
2.把刚刚读入进来的文本进行分解
3.使用处理规则处理文本
4.输出一行,赋值给$0($0代表当前行),直到处理完成
5.把处理完成之后的所有的数据交给END{}来再次处理

3.4、awk当中的预定义变量

$0 :代表当前行 
  [root@localhost ~]# awk  '{print $0 "---"}' 2.txt :打印文件内容,每一行就在后面加---
	
$n : 代表分割后的第n列字段
  [root@localhost ~]# awk -F/ '{print $1}' 2.txt :打印文件内容:用/分割后的第1列字段

NF :记录每一行用分隔符后的字段数量
  [root@localhost ~]# awk -F/ '{print NF}' 2.txt :NF打印字段数量
  [root@localhost ~]# awk -F: '{print $NF}' /etc/passwd :$NF打印最后一列字段

NR :记录行号
  [root@localhost ~]# awk -F/ '{print NR}' 2.txt

FS :指定文本内容的分隔符(默认空格);自定义变量的优先级要高于-F参数
  [root@localhost ~]# awk -F/ 'BEGIN{OFS="--"}{print $NF,$1}' 2.txt
  [root@localhost ~]# awk -F/ 'BEGIN{OFS="--"}{print $1,$2,$3}' 2.txt

image

image

image

image

image

3.5、awk当中处理规则的执行流程

以下至少有一个,最多有四个。执行流程从上到下。

BEGING : 定义变量
// : 正则,匹配
{} : 处理文本
END{} :打印之前统一处理一遍

3.6、awk中的函数

print : 打印(前面举了很多例子了)
printf :格式化打印,给个双引号
  [root@localhost ~]# awk -F/ 'BEGIN{OFS="|"}{printf"|%-10s|%-10s|\n", $1,$2}' 2.txt

	%s : 字符串
	%d : 数字
	- :左对齐
	+ :右对齐
	10 :至少占用10个字符

image

3.7、awk中的定位

1.正则表达式 :两个//中间的就是正则表达式
  [root@localhost ~]# awk -F/ '/^345/{print $0}' 2.txt

# 忽略大小写怎么写?
  [root@localhost ~]# awk -F/ '/qew|QEW|QEw|QeW|qEW/{print $0}' 2.txt

2.比较表达式 :比较的是本文内的内容;
	> : 大于
	< : 小于
	>= : 大于等于
	<= : 小于等于
    ~  : 匹配正则
    !~ : 不匹配正则

    # 要求打印属组id大于属主id的所有行
  	[root@localhost ~]# awk -F: '$4 > $3{print $0}' /etc/passwd

	# 结尾包含bash的所有行
 	 [root@localhost ~]# awk -F: '$NF ~ /bash/{print $0}' /etc/passwd

	# 结尾不包含bash的所有行
 	 [root@localhost ~]# awk -F: '$NF !~ /bash/{print $0}' /etc/passwd

3.逻辑表达式:
	&&	: 逻辑与
	||  :逻辑或
	!	:逻辑非
	# 属主id加属组id大于2000并且相乘大于2000
  	[root@localhost ~]# awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd
	# 属主id加属组id大于2000或者相乘大于2000
	[root@localhost ~]# awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd
	# 属主id加属组id不大于2000
 	 [root@localhost ~]# awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd

4.算数表达式:
	+ :加
	- :减
	* :乘
	/ :除
	% :整除

	# 要求属组 + 属主的ID 大于 2000
   [root@localhost ~]# awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd
	#:要求属组 * 属主的ID 大于 2000
  	[root@localhost ~]# awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd
	# 要求打印偶数行
  	[root@localhost ~]# awk -F: 'NR % 2 == 0{print $0}' /etc/passwd
	# 要求打印奇数行
  	[root@localhost ~]# awk -F: 'NR % 2 == 1{print $0}' /etc/passwd

5.条件表达式:跟比较表达式相似,比较的是自定义的内容;
	== :等于
	> :大于
	< :小于
	>= :大于等于
	<= :小于等于
	# 要求打印第三行
  	[root@localhost ~]# awk -F/ 'NR==1{print $0}' 2.txt

6.范围表达式:
	# 打印root开头的行到ftp开头的行
  	[root@localhost ~]# awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd

image

image

image

image

3.8、流程控制

流程控制只存在循环之中。

3.8.1 if

# 如果行的第3列字段大于第4列字段,打印0,否则打印1。
  [root@localhost ~]# awk -F/ '{if($3>$4){print "0"}else{print "1"}}' 2.txt
# 每隔5行,打印一行横线
  [root@localhost ~]# awk -F: '{if(NR%5==0){print "----------------"}print $0}' /etc/passwd

格式:
    if(){} :单条件
    if(){}else{} :双条件
    if(){}else if(){}else{} :多条件

image

3.8.2 for

# 循环打印每行打印2次
  [root@localhost ~]# awk -F/ '{for(i=2;i>0;i--){print $0}}' 2.txt

格式:
	for(i="初始值";条件判断;游标){}

image

3.8.3 while

# 循环打印每行打印2次,每次后面加打印次数
  [root@localhost ~]# awk -F/ '{i=1; while(i<=2){print $0, i++}}' 2.txt

格式:
	i="初始值"; while(条件判断){}

image

posted @ 2021-12-20 22:07  90啊  阅读(164)  评论(0编辑  收藏  举报