2.grep sed awk

grep

grep的语法格式:
grep -option(参数) ‘word’(关键词) file(文本文件)

例:grep -i oldwang /etc/passwd
grep -r “test” ./

grep -i   --- 忽略大小写过滤信息
grep -A   --- 将指定信息后几行进行过滤
grep -B   --- 将指定信息前几行进行过滤
grep -C   --- 将指定信息为中心,附近几行信息做过滤
grep -o   --- 只显示过滤筛选的信息
grep -E   --- 识别扩展正则符号
grep -c   --- 统计筛选出现行数
grep -v   --- 进去取反筛选
grep -w   --- 只会匹配单词字符串信息
grep -n   --- 显示过滤筛选行号信息
grep -r   --- 递归筛选目录中所有文件数据信息

sed

作用:可以实现过滤筛选, 做文本内容编辑处理(增 删 改 查)

原理:处理文件时,按照每行信息进行处理,找出符合条件的信息,然后执行相应的操作

语法结构: sed [参数] '条件 指令' 文件

sed命令实际用法
环境准备:
cat >person.txt<<EOF
laowang
laoliu
laoli
laohei
laozhang
EOF

sed查看信息用法:

按照行号进行查看信息:
查找单行信息
sed -n '2p' person.txt 查找第二行信息并打印(p:打印)
-n参数仅显示指令处理后的结果

查找连续多行信息
sed -n '1,4p' person.txt 查找第一行到第四行的信息打印出来

查找某一行到最后一行的信息
sed -n '2,$p' person.txt
$:这里表示到最后一行

查找不连续的多行信息 ,用封号分隔
sed -n '1p;3p;5p' person.txt

按照字符内容查看信息:
查找单行信息
sed -n '/laowang/p' person.txt
输出结果:
laowang

查找 连续的多行信息
sed -n '/laowang/,/laoli/p' person.txt 用逗号分隔两个连续的范围
输出结果:
laowang
laoliu
laoli

查找 不连续的多行信息
sed -n '/laowang/p;/laohei/p' person.txt
输出结果:
laowang
laohei

sed添加信息用法:

在指定行后面添加信息:
sed -i '1laobai' person.txt
-i表示真正要添加信息了,在第一行的后面添加信息 1代表第一行,a代表后面

在指定行前面添加信息:
sed -i '2ilaosun' person.txt
在第二行的上面添加信息 2代表第2行,2后面的i代表在上面插入信息

**在连续的多行后面添加信息 **
sed -i '2,5alaobaby' person.txt 在第二行到第五行的每一行后面添加信息laobaby

在不连续的多行后面添加信息
sed -i -e '1a111' -e '3a111' -e '5a111' person.txt
-e 表示可以识别多个操作信息

sed -i.bak -e '1aoldboy' -e '3aoldboy' -e '5aoldboy' person.txt — 先备份数据. 修改文件

sed删除信息用法:

删除指定行信息

按行号删除
sed -i '2d' person.txt

-i表示真正删除文件的内容
d表示删除
-i.bak参数可在操作前做备份再操作,但是后面不能再跟其他参数了,一定要将参数放在它的前面才会生效

按字符信息删除
sed -i '/^oldboy$/d' person.txt
删除了文件里只有oldboy字符的行

sed '/oldboy/d' person.txt
删除了文件里所有的oldboy

删除文件空行信息:
sed -i '/^$/d' person.txt

删除多行信息:
按照行号删除: sed -i '1,3d' person.txt
按照信息删除: sed -i '/laoliu/,/yy/d' person.txt

sed -ni '1d' person.txt
错误操作, 记住-i 参数 不能和 -n参数同时出现,会使所有内容都消失

sed替换信息用法:

后向引用前项替换:
sed 参数 's#需要替换的信息#替换成什么信息#g' 文件名
sed -i 's#aaa#bbb#g' text.txt

指定最后一行进行替换
sed -i '$s#aaa#bbb#g' text.txt
$ :指定最后一行

把一行中只有oldboy字符的行,替换成oldgirl
sed -i '/^oldboy$/s#oldboy#oldgirl#g' person.txt

将一行部分信息进行删除
sed '1s@wang,@@g' person.txt 只把第一行中的wang删除
结果
lao
laoliu
laoli
laohei
laozhang

后向引用前项替换:

目的:
echo 123456789123 用<123><456>的格式展示
方法:
echo 123456789123|sed -r ‘s#([0-9]{3})#<\1>#g’
结果:
<123><456><789><123>

echo 123456789123|sed -r ‘s#([0-9]{3})#<&>#g’
<123><456><789><123>


& --- 特殊后项引用前项符号, 引用前面语句中正则匹配到的信息,
相当于匹配到的内容赋给&,对&进行处理 ,其实就是对匹配到的内容进行处理

例:
将nginx.conf中的注释行全部去掉
sed '/^ *#/d' /etc/nginx/nginx.conf

思路:
1.先定位 //	 : 匹配
2. '/^ *#/d'	: * 前导字符 后面一个#号 空格开头( ^ *表示以一个或多个空格开头,^和*之间有空格)
/^ *#/d 意为删除一个或者多个空格开头的并且后面跟了一个#号的行

将nginx.conf中每一行之前增加注释
sed 's/.*/# &/g' /etc/nginx/nginx.conf

s g : 全部替换
/.*/	: 代表原本文件中的全部内容 匹配文件的所有内容,也就是被替换的内容
/# &/	: 定义替换内容  (# & 之间有空格,相当于在每行开头增加一个#后面再跟一个空格)
&		: 代表前面 /.*/ 匹配到的所有内容 &相当于.*  相当于变量名
's/.*/# &/g' :意为匹配文件的每行内容,然后在匹配到的每行内容前添加一个#号和空格


修饰指定信息取反: sed -n '/^$/!p' person.txt

取出文件行号信息: sed '=' person.txt

执行多个相同指令: sed -n '1p;3p;5p' person.txt

利用sed取出IP地址
ip a s eth0 |sed -n '3p' |sed -r 's#^. *et (.* )#\1#g'|sed -r 's#(.* )/24.*$#\1#g'

ip a s eth0|sed -n '3p' 表示取第三行信息
sed -r 's#^. *et (.* )#\1#g' 表示只保留inet 后面的信息
sed -r 's#(.* )/24.*$#\1#g' 表示只保留/24之前的信息

可以简化成: ip a s eth0 |sed -rn '3s#^.*et (.* )/24.*$ #\1#gp'


方法二:
ip a s eth0 |sed -rn '3s#^.*et ([0-9.]+).*$#\1#gp'


方法三:
ip a s eth0 | sed -n '3p' |awk -F "[ /]+" '{print $3}'


方法四:
ip a s eth0 | awk -F "[ /]+" 'NR==3{print $3}'


方法五:

hostname -I

hostname -I|awk -F' .*' '{print $1}'


awk

awk基础功能

awk命令说明
模式扫描(根据条件输出信息) 和 语言编写能力(可以编写脚本 脚本语句-循环语句/判断语句)

awk作用:
1) awk命令擅长对文件列进行操作 (awk在识别列信息的时候,默认以空格为分隔符,来识别列信息的)
2) awk命令擅长对数据文件进行分析
3) awk命令可以编写脚本

awk命令执行原理:
逐行读取信息
判断是否为需要的信息
如果是满足条件的信息,就对满足条件的信息做相应的处理
如果不是满足条件的信息,就会继续读取下一行信息

awk命令语法结构
awk [参数] '模式{动作}' 文件

awk命令操作练习
准备测试用的文件:
cat test.txt |column -t 可以把文件内容按列对齐

       Zhang  Dandan    41117397    :250: 100:175
       Zhang  Xiaoyu    390320151   :155:90:201
       Meng   Feixue    80042789    :250:60:50
       Wu     Waiwai    70271111    :250:80:75
       Liu    Bingbing  41117483    :250: 100:175
       Wang   Xiaoai    3515064655  :50:95:135
       Zi     Gege      1986787350  :250:168:200
       Li     Youjiu    918391635   :175:75:300
       Lao    Nanhai    918391635   :250: 100:175	

根据条件筛选相应信息
例:
01. 显示xiaoyu的姓氏和ID号码
思路一: 根据条件将相应行信息找出来
awk ‘/xiaoyu/’ 文件信息
思路二: 完成具体需求任务
awk '/Xiaoyu/{print $1,$3}' test.txt
awk '/Xiaoyu/{print $1" "$3}' test.txt

利用awk进行筛选匹配信息, 可以根据列筛选信息
例:
只显示Xiaoyu这个人自己的记录
awk '$2~/Xiaoyu/{print $4}' awk.txt $2~意思为第二列有没有相匹配的信息

指定列与列之间的分隔符
例:
姓氏是zhang的人,显示他的第二次捐款金额及他的名字
思路一: 根据条件将相应行信息找出来
awk '$1~/Zhang/' awk.txt
Zhang Dandan 41117397 :250: 100:175
Zhang Xiaoyu 390320151 :155:90:201
思路二: 完成具体需求任务
awk -F "[: ,]+" '$1~/Zhang/{print $1,$2,$5}' awk.txt
[ ]可以一次指定多个符号为列与列之间的分隔符,比如空格,:和,

例:
awk -F ":" '{print $2,$3}' test02.txt
-F ":"利用-F指定列与列之间的分隔符号,表示指定以冒号当作列与列之间的分隔符来识别列信息

例:
awk -F "[: ,]+" '{print $2,$3}' test02.txt
这里+号的意义是将多个连续分隔符号,汇总为一个整体,不管几个都看作是一个,比如:::会被看作为一个::也会被看作是一个:

更具特定开头或结尾匹配信息
例:
显示所有以41开头的ID号码的人的全名和ID号码
思路一: 根据条件将相应行信息找出来
思路二: 根据需求显示指定列信息
awk '$3~/^41/{print $1,$2,$3}' awk.txt 筛选出以第三列以41开头的行,然后打印该行的第123列的信息
Zhang Dandan 41117397
Liu Bingbing 41117483

例:
显示所有以5或者0结尾ID号码, 并且显示全名和ID
awk '$3~/[50]$/{print $1,$2,$3}' awk.txt

通过取反匹配信息
例:
不要显示以41开头的信息id信息, 显示其他id信息人的全名/id号码(!表示取反)
awk '$3!~/^41/{print $1,$2,$3}' awk.txt
Zhang Xiaoyu 390320151
Meng Feixue 80042789
Wu Waiwai 70271111
Wang Xiaoai 3515064655
Zi Gege 1986787350
Li Youjiu 918391635
Lao Nanhai 918391635

替换信息格式
例:
显示Xiaoyu的捐款, 显示时都以$开头,
如$110$220$330

awk替换信息格式:
gsub(//,"",$n)
//— 定义需要进行替换的信息
"" — 定义替换之后的信息
$n — 将第几列信息做替换

awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print $4}' awk.txt
$155$90$201

awk高级功能

awk模式概念:

       1. 可以利用字符信息 或者 正则信息 以及 行号, 作为匹配条件    基础模式
       2. 可以利用BEGIN/END作为执行动作方式                       特殊模式 

BEGIN:在开始处理每一行信息之前要做的事情
END:在处理完每一行信息之后要做的事情

BEGIN作用说明:
1.可以利用BEGIN实现计算器功能 awk 'BAGIN{print 2*2}' 输出结果为4
2. 可以设置变量/修改变量
NR: 表示行号信息
NF: 表示列信息,直接调用$NF,代表最后一列的信息,$(NF-1)代表倒数第一列
FS: 指定列分隔符号信息(相当于修改内置分隔符)

以下命令效果一样:都是设定列的分隔符
awk 'BEGIN{FS="[: ,]+"}{print $2}' test02.txt 在匹配信息之前先设定列的分隔符为:与,
awk -vFS="[: ,]+" '{print $2}' test02.txt
awk -F "[: ,]+" '{print $2}' test02.txt

END作用说明: 输出最终的结果信息

awk统计算法公式:
累加算法:i=i+1

例:
输出被筛选信息的具体个数
awk '$1~/oldboy/{i=i+1;print i}' test04.txt
1
2
3

 head -15 test04.txt 
      oldboy             符合条件:  i=i+1(i初始值0)--> i=0+1=1 ---> print i --> 1    
      oldgirl 
      olddog
      oldgirl
      olddog
      oldboy             符合条件:  i=i+1(i初始值1)--> i=1+1=2 ---> print i --> 2 
      oldgirl
      olddog
      oldgirl
      olddog
      oldboy             符合条件:  i=i+1(i初始值2)--> i=2+1=3 ---> print i --> 3 
      oldgirl
      olddog

求和运算: i=i+$n

例:
awk '{i=i+$1;print i}' test05.txt
1
3
6
10
15
21
28
36
45
55

cat test05.txt 
      1      符合条件: i=i+$1=i+1(i初始值为0)  i=0+1=1 print i --> 1
      2      符合条件: i=i+$1=i+2(i初始值为1)  i=1+2=3 print i --> 3
      3      符合条件: i=i+$1=i+3(i初始值为3)  i=3+3=6 print i --> 6
      4
      5
      6
      7
      8
      9
      10

在处理完每一行信息后输出输出结果:
awk '$1~/oldboy/{i=i+1}END{print i}' test04.txt
202

awk '{i=i+$1}END{print i}' test05.txt
55

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值