linux三剑客
grep 过滤查找内容。筛子
sed 取行,替换,删除,追加
awk 取列
1.grep

2.sed
Sed是操作、过滤和转换文本内容的强大工具。
常用功能有对文件实现快速增删改查(增加、删除、修改、查询),
其中查询的功能中最常用的2大功能是过滤(过滤指定字符串)和取行(取出指定行)。
语法:
sed [选项] [sed内置命令字符] [文件]
选项:
-n 取消默认sed的输出,常与sed内置命令的p连用 -i 直接修改文件内容,而不是输出到终端。(-i 的sed后面是要有文件的) -e 多次sed操作 -r 不需要转义(使用反向引用需要)
内置命令符:
sed的内置命令字符说明 s 替换 g 全局global p 打印print 两种情况 1.打印指定行 2.与-n配合 打印修改行 d 删除delete a 添加 默认是指定行末 i 插入 指定行前 // 匹配
说明:
1.关于-n 默认情况下sed会输出所有内容
2. s# # #g中 只有前两个##可以使用正则
练习
环境: [root@oldboyedu ~/test]# cat oldgirl.txt I am oldboy teacher! I like badminton ball ,billiard ball and chinese chess! our site is http://www.oldboyedu.com my qq num is 49000448. 问题1:输出oldboy.txt的第2-3行内容※。 [root@oldboyedu ~/test]# sed -n '2,3p' oldgirl.txt I like badminton ball ,billiard ball and chinese chess! our site is http://www.oldboyedu.com [root@oldboyedu ~/test]# head -3 oldgirl.txt |tail -2 I like badminton ball ,billiard ball and chinese chess! our site is http://www.oldboyedu.com 问题2:过滤出含有oldboy字符串的行※。 [root@oldboyedu ~/test]# sed -n '/oldboy/p' oldgirl.txt I am oldboy teacher! our site is http://www.oldboyedu.com [root@oldboyedu ~/test]# grep oldboy oldgirl.txt I am oldboy teacher! our site is http://www.oldboyedu.com 问题3:删除含有oldboy字符串的行※。 [root@oldboyedu ~/test]# sed '/oldboy/d' oldgirl.txt I like badminton ball ,billiard ball and chinese chess! my qq num is 49000448. [root@oldboyedu ~/test]# grep -v "oldboy" oldgirl.txt I like badminton ball ,billiard ball and chinese chess! my qq num is 49000448. 问题4:将文件中的oldboy字符串全部替换为oldgirl※。 [root@oldboyedu ~/test]# sed 's#oldboy#oldgirl#g' oldgirl.txt I am oldgirl teacher! I like badminton ball ,billiard ball and chinese chess! our site is http://www.oldgirledu.com my qq num is 49000448. vim替换: 问题5:将文件中的oldboy字符串全部替换为oldgirl,同时将QQ号码49000448改为31333741。 [root@oldboyedu ~/test]# sed -e 's#oldboy#oldgirl#2' -e 's#49000448#31333741#g' oldgirl.txt I am oldboy teacher! I like badminton ball ,billiard ball and chinese chess! our site is http://www.oldboyedu.com my qq num is 31333741. 问题6:在oldboy.txt文件的第2行后追加文本。 [root@oldboyedu ~/test]# sed '2a I teacher linux.' oldgirl.txt I am oldboy teacher! I like badminton ball ,billiard ball and chinese chess! I teacher linux. our site is http://www.oldboyedu.com my qq num is 49000448. [root@oldboyedu ~/test]# cat oldgirl.txt I am oldboy teacher! I like badminton ball ,billiard ball and chinese chess! our site is http://www.oldboyedu.com my qq num is 49000448. [root@oldboyedu ~/test]# sed -i '2a I teacher linux.' oldgirl.txt [root@oldboyedu ~/test]# cat oldgirl.txt I am oldboy teacher! I like badminton ball ,billiard ball and chinese chess! I teacher linux. our site is http://www.oldboyedu.com my qq num is 49000448. [root@oldboyedu ~/test]# sed '2i I teacher linux.i' oldgirl.txt I am oldboy teacher! I teacher linux.i I like badminton ball ,billiard ball and chinese chess! I teacher linux. our site is http://www.oldboyedu.com my qq num is 49000448.
3.awk
语法:
awk [option] 'pattern{action}' file ...
awk [参数] '条件{动作}' 文件 ...
参数:
-F 指定字段分隔符 -v*
常用变量:
$0 打印所有 $n 打印列 NF 列 NF==1 $NF 最后一列 $(NF-n) 倒数n列 NR 记录行号
说明:
默认情况下 分隔符为空格 相当于[ ]+
练习
test.txt文件内容如下
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
问题1:取test.txt文件的第2行到第3行的内容。
[root@oldboyedu ~]# awk 'NR>1&&NR<4' oldboyedu.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@oldboyedu ~]# awk 'NR==2,NR==3' oldboyedu.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
问题2:过滤出含有root字符串的行※。
[root@oldboyedu ~]# awk '/root/' oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk /root/ oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]#
[root@oldboyedu ~]# awk "/root/" oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
##建议统一三剑客都用''
问题3:删除含有root字符串的行※。
[root@oldboyedu ~]# awk '/^[^r]/' oldboyedu.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[^r] 非r
^[^r] 以非r字符卡头
问题4:取文件的第一列、第三列和最后一列内容,并打印行号※。
[root@oldboyedu ~]# awk -F ":" '{print NR,$1,$3,$NF}' oldboyedu.txt
1 root 0 /bin/bash
2 bin 1 /sbin/nologin
3 daemon 2 /sbin/nologin
4 adm 3 /sbin/nologin
5 lp 4 /sbin/nologin
问题5:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)。
[root@oldboyedu ~]# ifconfig eth0|awk 'NR==2{print $2}'
10.0.0.201
C6
[root@oldboy ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:D0:87:20
inet addr:10.0.0.202 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fed0:8720/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:243 errors:0 dropped:0 overruns:0 frame:0
TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:20674 (20.1 KiB) TX bytes:8706 (8.5 KiB)
[root@oldboy ~]# ifconfig eth0|awk 'NR==2{print $2}'
addr:10.0.0.202
[root@oldboy ~]# ifconfig eth0|awk 'NR==2{print $2}'|awk -F ":" '{print $2}'
10.0.0.202
[root@oldboy ~]# ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'
10.0.0.202
问题6:过滤文件中第一列内容匹配root的字符串,把符合的行的最后一列输出
awk -F ":" '$1~/root/ {print $NF}' test.txt
关于~
~:匹配
尾
shell中补充awk剩余用法
2020.3.30 goose

浙公网安备 33010602011771号