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的主要内容,如果未能解决你的问题,请参考以下文章