grep
在使用Linux的过程中,场景有时候便会涉及到查找文本文件的内容,假如现在我们想要在一个三百多行的文本中找到特定的语句,或者在这其中查找是否含有特定的字段应该怎么办呢?
这里便出现了专门的文本处理工具——grep,grep是Linux中常用的文本处理工具之一。
grep的全称为“ Global search Regular Expression and Print out the line”。
全称中的“Glibal search”意思为全局搜索的意思。
全称中的“Regular Expression”意思为正则表达式。
所以从全称中就可以理解为gerp是一个可以利用正则表达式的全局搜索工具。grep会按照正则表达式的匹配原则在文本文件中按照逐行匹配处理的方法来处理文本并输出。
来看看grep的用法。
--color=auto 或者 --color:表示对匹配到的文本着色显示
-i:在搜索的时候忽略大小写
-n:显示结果所在行号
-c:统计匹配到的行数,注意,是匹配到的总行数,不是匹配到的次数
-o:只显示符合条件的字符串,但是不整行显示,每个符合条件的字符串单独显示一行
-v:输出不带关键字的行(反向查询,反向匹配)
-w:匹配整个单词,如果是字符串中包含这个单词,则不作匹配
-Ax:在输出的时候包含结果所在行之后的指定行数,这里指之后的x行,A:after
-Bx:在输出的时候包含结果所在行之前的指定行数,这里指之前的x行,B:before
-Cx:在输出的时候包含结果所在行之前和之后的指定行数,这里指之前和之后的x行,C:context
-e:实现多个选项的匹配,逻辑or关系
-q:静默模式,不输出任何信息,当我们只关心有没有匹配到,却不关心匹配到什么内容时,我们可以使用此命令,然后,使用"echo $?"查看是否匹配到,0表示匹配到,1表示没有匹配到。
-P:表示使用兼容perl的正则引擎。
-E:使用扩展正则表达式,而不是基本正则表达式,在使用"-E"选项时,相当于使用egrep。
扩展正则表达式
^ 行首
$ 行尾
\<, \b 语首
\>, \b 语尾
() 分组
后向引用:\1, \2, ...
| 或者
a|b a或b
C|cat C或cat
(C|c)at Cat或cat
来看看案例。
案例1.统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来
[root@centos7 ~]# grep -v '\/sbin\/nologin' /etc/passwd | cut -d: -f1
root
sync
shutdown
halt
longge
上面的案例开始匹配了/sbin/nologin关键词,但是案例中只需要除了它之外的shell,所以讲它使用-v选项排除开就可以了。
案例2.查出用户UID最大值的用户名、UID及shell类型
[root@centos7 ~]$ grep $(cat /etc/passwd| cut -d: -f 3 | sort -rn |head -n1 ) /etc/passwd |cut -d: -f 1,3,7
longge:1000:/bin/bash
案例3.统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
[root@iz2zed4h7bg5dihzfqhmn9z ~]# ss -nt |grep '^ESTAB'|tr -s ' ' :|cut -d: -f 6|sort|uniq -c | sort -rn
1 182.150.165.42
1 100.100.30.25
上面的案例中ss -nt 查看连接情况,然后将EATAB状态的过滤出来,在进行处理,最后提取出结果并完成排序。
案例4:编写脚本disk.sh,显示当前硬盘分区中空间利用率最大的值
#!/bin/bash
USE=$(df -h |grep '^\/dev' | grep -Eo "[0-9]+%" |cut -d"%" -f1 |sort -rn |head -1)
DISK=$(df -h |grep $USE\% |tr -s ' ' |cut -d ' ' -f 1)
echo "The System disk $DISK is used $USE"
[root@centos7 ~]# chmod +x disk.sh
[root@centos7 ~]# ./disk.sh
The System disk /dev/sda1 is used 14
[root@centos7 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.6M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mapper/centos-root 15G 1.4G 14G 10% /
/dev/sda1 1014M 137M 878M 14% /boot
/dev/mapper/centos-home 5.0G 33M 5.0G 1% /home
tmpfs 98M 0 98M 0% /run/user/0
案例5.编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
#!/bin/bash
HOSTNAME=$(hostname)
IP=$(ifconfig eth0 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -1)
OS=$(cat /etc/centos-release)
KERNEL=$(uname -r)
CPU=$(lscpu | grep "Model name" | tr -s " "|cut -d: -f2)
MEM=$(free -h |sed -En '2p' | tr -s ":" " " |cut -d " " -f2 )
DISK=$(lsblk | sed -En '2p' |tr -s " " | cut -d " " -f 4)
BEGINCOLOR="\e[1;35m"
ENDCOLOR="\e[0m"
echo ----------------SYSTEM INFO---------------------------
echo -e "HOSTNAME: $BEGINCOLOR$HOSTNAME$ENDCOLOR"
echo -e "IP: $BEGINCOLOR$IP$ENDCOLOR"
echo -e "OS: $BEGINCOLOR$OS$ENDCOLOR"
echo -e "KERNEL: $BEGINCOLOR$KERNEL$ENDCOLOR"
echo -e "CPU: $BEGINCOLOR$CPU$ENDCOLOR"
echo -e "MEM: $BEGINCOLOR$MEM$ENDCOLOR"
echo -e "DISK: $BEGINCOLOR$DISK$ENDCOLOR"
echo --------------------END-------------------------------