shell编程之grep

Posted givenchy_yzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之grep相关的知识,希望对你有一定的参考价值。

一、grep

grep命令主要用于过滤文本,grep家族如下

grep: 在文件中全局查找指定的正则表达式,并打印所有包含该表达式的行
egrep:扩展的egrep,支持更多的正则表达式元字符
fgrep:固定grep(fixed grep),有时也被称作快速(fast grep),它按字面解释所有的字符

原理及命令格式

grep打开文件,每读一行,都用正则表达式去匹配一次,但凡匹配成功一次,该行就被过滤出来

#命令格式
grep [选项] PATTERN 文件1 文件2 ...
[root@localhost ~]# grep 'root' /etc/passwd
[root@localhost ~]# fgrep 'bash' /etc/passwd

找到:				# grep返回的退出状态为0
没找到:			    # grep返回的退出状态为1
找不到指定文件:	  #   grep返回的退出状态为2

grep 命令的输入可以来自标准输入或管道,而不仅仅是文件,例如:

ps aux |grep 'nginx'

选项:
-n:–line-number 在过滤出的每一行前面加上他=它在文件中相对应的行号
-o --only-macthing 只显示匹配的内容
-i:–ignore-care 忽略大小写
–color: 加颜色(默认就是开启)
-q, --quiet, --silent 静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容,返回0为找到了,返回1没找到,返回2找不到指定文件
-l:–files-with-matches 如果匹配成功,则将文件名打印出来,失败则不打印通常-rl一起用
-r,-R:–recursive 递归
-A 2 后两行
-B 2 前两行
-C 2 前后两行
-v 取反,(只显示不匹配的行,也就是过滤掉grep的结果)
-c, --count 如果匹配成功,统计匹配到的行数
w 匹配单词
-P 匹配非贪婪的字符(一般与.*?连用)
-E 等于egrep,扩展

示例:

# 1、-n显示包含root的行,并显示其行数
[root@localhost ~]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin


# 2、-o只显示文件中匹配到的root
[root@localhost ~]# grep -o 'root' /etc/passwd
root
root
root
root


# 3、-q 静默输出,输出结果不打印到屏幕上
[root@localhost ~]# grep -q 'root' /etc/passwd 
[root@localhost ~]# echo $?
0
# 4、--color加颜色
[root@localhost ~]# alias grep
alias grep='grep --color=auto'


# 5、-i过滤时忽略大小写
[root@localhost ~]# echo "EGON" |grep -i egon 
EGON


# 6、-A\\-B\\-C输出过滤到文件的后两行、前两行、前后两行
[root@localhost ~]# grep -A 2 'root' /etc/passwd
[root@localhost ~]#  grep -B 2 'root' /etc/passwd
[root@localhost ~]#  grep -C 2 'root' /etc/passwd

# 7、-c统计过滤内容次数
[root@localhost ~]# grep -c 'root' /etc/passwd
2


# 8、-v反向查找只显示不匹配的内容
[root@localhost ~]# ps aux | grep nginx |grep -v grep
[root@localhost ~]# ps aux | grep [n]ginx

# 9、-w匹配单词
[root@localhost ~]# netstat -ntlp |grep -w 111
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1097/rpcbind        
tcp6       0      0 :::111                  :::*                    LISTEN      1097/rpcbind  

[root@localhost ~]# netstat -ntlp |grep '\\<22\\>'
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1412/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      1412/sshd    


[root@localhost ~]# netstat -ntlp |grep '\\b22\\b'
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1412/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      1412/sshd  
                        
                        
# 10、-rl 查找文件内容
[root@localhost ~]# grep -rl 'root' /etc  # 将/etc目录下所有包含'root'内容的文件都列出来

ps aux : 查看系统上运行的进程
有上述代码可知grep也支持管道符号,即三剑客都支持管道符号,都支持正则表达式

kill -9 进程号:强制杀死一个进程

作业:
写一个脚本可以远程操作100台机器并改密码

[root@web02 ~]# cat gaimi.sh 
#!/bin/bash

while read line
do
    user=`echo $line | awk -F: '{print $1}'` #user
    old_pwd=`echo $line | awk -F: '{print $2}'` #old password
    new_pwd=`echo $line | awk -F: '{print $3}'` #new password
    ip=`echo $line | awk -F: '{print $4}'` #ip
    cmd=`echo $new_pwd | passwd --stdin root`
    
expect << EOF
    spawn ssh $user@$ip $cmd

    expect {
        "yes/no" {send "yes\\r";exp_continue}
        "*assword" {send "$old_pwd\\n"}
    }  
    expect eof

EOF
done < passwd.txt

以上是关于shell编程之grep的主要内容,如果未能解决你的问题,请参考以下文章

linux12shell编程 --> 三剑客之grep命令

shell编程之grep命令的使用

shell编程之grep命令

shell编程之grep

Linux之Shell编程(17)--grep关键字详解演示

Linux之Shell编程(17)--grep关键字详解演示