linux三剑客grep、sed、awk练习


  grep:过滤文本

  sed:修改文本

  awk:处理文本

1、找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写

[root@localhost ~]# grep -E '^[sS]' /proc/meminfo
[root@localhost ~]# sed -r -n '/^[sS]/p' /proc/meminfo # -n:取消默认输出
[root@localhost ~]# awk '/^[sS]/{print $0}' /proc/meminfo
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Shmem:              7676 kB
Slab:              45744 kB
SReclaimable:      23440 kB
SUnreclaim:        22304 kB

2、显示当前系统上的以root,centos或者user开头的信息

[root@localhost ~]# grep -rE '^(root|centos|user)' /etc/
/etc/pki/ca-trust/extracted/README:root CA certificates.
/etc/pki/ca-trust/extracted/java/README:root CA certificates.
/etc/pki/ca-trust/extracted/openssl/README:root CA certificates.
/etc/pki/ca-trust/extracted/pem/README:root CA certificates.
/etc/yum/vars/contentdir:centos

3、找出/etc/init.d/functions文件下包含小括号的行

[root@localhost ~]# grep -E '\(|\)' /etc/init.d/functions
    /etc/init.d/*|/etc/rc.d/init.d/*)
systemctl_redirect () {
    start)
        s=$"Starting $prog (via systemctl): "
    stop)
        s=$"Stopping $prog (via systemctl): "
    reload|try-reload)

4、输出指定目录的基名

[root@localhost sysconfig]# pwd | awk -F/ '{print $NF}'
sysconfig

5、找出网卡信息中包含的数字

[root@localhost ~]# grep -oE '[0-9]+' /etc/sysconfig/network-scripts/ifcfg-eth[01]
/etc/sysconfig/network-scripts/ifcfg-eth0:4
/etc/sysconfig/network-scripts/ifcfg-eth0:6
/etc/sysconfig/network-scripts/ifcfg-eth0:6
/etc/sysconfig/network-scripts/ifcfg-eth0:6
/etc/sysconfig/network-scripts/ifcfg-eth0:6
/etc/sysconfig/network-scripts/ifcfg-eth0:6
/etc/sysconfig/network-scripts/ifcfg-eth0:0
/etc/sysconfig/network-scripts/ifcfg-eth0:3
/etc/sysconfig/network-scripts/ifcfg-eth0:7
/etc/sysconfig/network-scripts/ifcfg-eth0:60
/etc/sysconfig/network-scripts/ifcfg-eth0:479

6、找出/etc/passwd下每种解析器的用户个数

# 数组:{"bash":10,"sh":9,"zsh":1}
[root@localhost ~]# awk -F: '{arr[$NF]++}END{for(i in arr){print i,arr[i]}}' /etc/passwd /bin/sync 1 /bin/bash 7 /sbin/nologin 22 /sbin/halt 1 /sbin/shutdown 1

7、获取网卡中的ip,用三种方式实现

[root@localhost ~]# ip a | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'
[root@localhost ~]# ip a | sed -r -n '/([0-9]{1,3}\.){3}[0-9]{1,3}/p'
[root@localhost ~]# ip a | awk '/([0-9]{1,3}\.){3}[0-9]{1,3}/{if(NR==3){print $2}else{print $2,$4}}'
127.0.0.1/8
192.168.15.102/24 192.168.15.255
172.16.1.102/20 172.16.15.255

8、搜索/etc目录下,所有的.html或.php文件中main函数出现的次数

# 反引号(``)将里面的结果作为操作对象;xargs:将内容打印成行
[root@localhost ~]# grep -rE 'main' `find /etc/ -name "*.html" -o -name "*.php" | xargs` |wc -l
1134

9、过滤掉php.ini中注释的行和空行

# ^$:空行
[root@localhost ~]# grep -vE '^\ *;|^$' /etc/php.ini
[PHP]
engine = On
short_open_tag = Off
asp_tags = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off

10、找出文件中至少有一个空格的行

  [root@localhost ~]# grep -E '\ +' /etc/php.ini

11、过滤文件中以#开头的行,后面至少有一个空格

[root@localhost ~]# grep -E '^#\ +' /etc/fstab
# /etc/fstab
# Created by anaconda on Wed Dec  8 16:57:29 2021
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

12、查询出/etc目录中包含多少个root

[root@localhost ~]# grep -roE 'root' /etc/ | wc -l
600

13、查询出所有的qq邮箱

  [root@localhost ~]# grep -E '[0-9A-Za-z-_]+@qq\.com'

14、查询系统日志中所有的error

  [root@localhost ~]# grep -E 'error' /var/log/messages

15、删除某文件中以s开头的行的最后一个词

[root@localhost ~]# grep -Ei '^s' 3.txt | grep -oE '[0-9A-Za-z]+' | xargs | awk '{for(i=0;i<(NF-1);i++){print $i}}'
sdfdf jkjdf sdf
sdfdf

  正确答案

[root@localhost ~]# grep -Ei '^s' 3.txt | sed -r 's/[0-9a-zA-Z]+$//g'
sdfdf jkjdf 

16、删除一个文件中的所有数字

  [root@localhost ~]# sed -r 's/[0-9]//g' 3.txt

17、显示奇数行

[root@localhost ~]# awk -F: 'NR%2==1{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

18、删除passwd文件中以bin开头的行到nobody开头的行

[root@localhost ~]# sed -r '/^bin/,/^nobody/d' /etc/passwd
root:x:0:0:root:/root:/bin/bash
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin

19、从指定行开始,每隔两行显示一次空行

[root@localhost ~]# awk -F: '{n=5;if(NR<=n){print $0}else{if((NR-5)%2==0){print " "}print $0}}' /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

20、每隔5行打印一个空行

[root@localhost ~]# awk -F: '{if(NR%5==0){print " "}print $0}' /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

21、不显示指定字符的行

[root@localhost ~]# grep -Ev 'l' 3.txt
jsdfds fersdf jere
sdfdf jkjdf sdf

22、将文件中1到5行中aaa替换成AAA

[root@localhost ~]# sed -r '1,5s/aaa/AAA/g' 3.txt
jakdfj djsfj jklll
feefAAAlljj jjll
fjklkjl
AAAfds fersdf jere
sdfdf jkjdf sdf
aaadfdf

23、显示用户id为奇数的行

[root@localhost ~]# awk -F: '$3%2==1{print $0}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin

24、显示系统普通用户,并打印系统用户名和id

# id=0:超级用户;0=1000:普通用户
[root@localhost ~]# awk -F: '$3>=1000{print $1,$3}' /etc/passwd
test 1000
test03 1001
tuser1 1002
tuser2 1003
tuser3 1004

25、统计nginx日志中独立用户数(ip维度计算)

[root@localhost ~]# awk '/([0-9]{1,3}\.){3}[0-9]{1,3}/{arr[$1]++}END{for(i in arr){print i}}' access.log
49.232.15.254
107.189.12.88
167.248.133.41
90.113.136.249
159.89.26.34
4.71.37.46
168.228.151.191
2.56.59.221
3.25.221.59
45.137.23.232

26、统计php.ini中每个词的个数

[root@localhost ~]# grep -oE '[0-9A-Za-z]+' 3.txt | awk '{arr[$1]++}END{for(i in arr){printf "%-15s | %-5d\n",i,arr[i]}}'
aaadfdf         | 1    
sdfdf           | 1    
feefaaalljj     | 1    
jklll           | 1    
jakdfj          | 1    
jkjdf           | 1    
aaafds          | 1    
fjklkjl         | 1    
fersdf          | 1    
jere            | 1    
jjll            | 1    
sdf             | 1    
djsfj           | 1    
jkll            | 3  

相关