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 打印匹配内容及其后n行 如:-A 2 后两行
-B 打印匹配内容及其前n行 如:-B 2 前两行
-C 打印匹配内容及其前后n行 如:-C 2 前后两行
-v 取反,(只显示不匹配的行,也就是过滤掉grep的结果)
-c, --count 如果匹配成功,统计匹配到的行数
w 匹配单词 (linux中就是单词连续不间断的且没有特殊字符分割的字母或数字就叫单词)
-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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值