Linux 运维常用命令 find、awk、sed、grep、vi、ps、lsof、rpm

先用一个脚本,模拟创建 14 个测试文件:

#!/bin/bash
for ((i=1;i<=10;i++));
do
if [ $i -lt 3 ]
then
 touch /home/mysql/test/test$i.sh
 touch /home/mysql/test/Phtest$i.sh
 touch /home/mysql/test/test$i.sh.bak
elif [ $i -lt 8 ]
then
 touch /home/mysql/test/test$i.log
else 
 touch /home/mysql/test/test$i.sql
fi
done

执行上面的脚本之后,会在 /home/mysql/test/ 目录下创建 14 个文件,文件名如下所示:

[mysql@mysql test]$ ll
总用量 8
-rwxrwxr-x 1 mysql mysql 278 12 月 28 15:04 create_file.sh
-rw-rw-r-- 1 mysql mysql  42 12 月 28 14:39 line.txt
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 Phtest1.sh
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 Phtest2.sh
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test10.sql
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test1.sh
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test1.sh.bak
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test2.sh
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test2.sh.bak
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test3.log
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test4.log
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test5.log
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test6.log
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test7.log
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test8.sql
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test9.sql

1. find 和 xargs

find 命令作用也是运维过程中,使用频率非常高的操作命令,他的作用是帮助运维人员,查找对应的文件,下面就来介绍一下最常用的 find 用法。

1.1 find 常用参数介绍

  • -exec:find 命令对匹配的文件执行该参数所给出的 shell 命令,这个命令非常好用
  • -name:查找要匹配的文件名称,name 可以用正则来匹配
  • -mtime -n +n:按文件更改时间来查找文件,-n 指 n 天以内,+n 指 n 天以前
  • -ctime -n +n:按文件创建时间来查找文件,-n 指 n 天以内,+n 指 n 天以前
  • -atime -n +n:按文件访问时间来查,-n 指 n 天以内,+n 指 n 天以前
  • -type b/d/c/p/l/f:查找的文件分别对应为块设备、目录、字符设备、管道、符号链接、普通文件
  • -size n[c]:查长度为 n 字节长度的文件,如果为+n,则是查找文件大小超过 n 个字节的文件列表
  • -mindepth -maxdepth:这两个参数配合一起使用,可以限制 find 可以查找的文件目录层次深度区间范围

1.2 find 案例

1. 查找 /home/mysql/test 目录下所有 sh 结尾的文件列表

[mysql@mysql test]$ find /home/mysql/test -name '*sh'  
/home/mysql/test/test1.sh
/home/mysql/test/test2.sh
/home/mysql/test/create_file.sh
/home/mysql/test/Phtest1.sh
/home/mysql/test/Phtest2.sh
/home/mysql/test/dir_01/test1.sh
/home/mysql/test/dir_01/test2.sh
/home/mysql/test/dir_01/dir_02/test7.sh
/home/mysql/test/dir_sh

2. 查找 /home/mysql/test 目录下所有 sh 结尾的文件列表,并指定文件类型为文件

[mysql@mysql test]$ find /home/mysql/test -name '*sh' -type f
/home/mysql/test/test1.sh
/home/mysql/test/test2.sh
/home/mysql/test/create_file.sh
/home/mysql/test/Phtest1.sh
/home/mysql/test/Phtest2.sh
/home/mysql/test/dir_01/test1.sh
/home/mysql/test/dir_01/test2.sh
/home/mysql/test/dir_01/dir_02/test7.sh

3. 查找 /home/mysql/test 目录下所有 sh 结尾的文件列表,并指定文件类型为文件,不查找 /home/mysql/test 目录下的子目录

[mysql@mysql test]$ find /home/mysql/test -mindepth 1 -maxdepth 1 -name '*sh' -type f 
/home/mysql/test/test1.sh
/home/mysql/test/test2.sh
/home/mysql/test/create_file.sh
/home/mysql/test/Phtest1.sh
/home/mysql/test/Phtest2.sh

4. 查找 /home/mysql/test 目录下所有 sh 结尾的文件列表,并指定文件类型为文件,文件大小超过 100 字节

[mysql@mysql test]$ find /home/mysql/test -name '*sh' -type f -size +100c
/home/mysql/test/create_file.sh

在这里需要注意一下,如果写成 -size 100c,只查找大小为 100 个字节的文件:

[mysql@mysql test]$ ls -l|grep -i create_file.sh
-rwxrwxr-x 1 mysql mysql 278 12 月 28 15:04 create_file.sh
[mysql@mysql test]$ 
[mysql@mysql test]$ find /home/mysql/test -name '*sh' -type f -size 278c
/home/mysql/test/create_file.sh
[mysql@mysql test]$ find /home/mysql/test -name '*sh' -type f -size 277c

5. 查找 /home/mysql/test 目录下所有 sh 结尾的文件列表,并指定文件类型为文件,不查找 /home/mysql/test 目录下的子目录,并将查找到的文件添加 .bak 后缀
在这里有 2 中实现方法,第一种使用 -exec,第二种使用 xargs:

[mysql@mysql test]$ find /home/mysql/test -mindepth 1 -maxdepth 1 -name '*sh' -type f -exec mv {
    
    } {
    
    }.bak \;
[mysql@mysql test]$ 
[mysql@mysql test]$ ls -l|grep -i bak
-rwxrwxr-x 1 mysql mysql 278 12 月 28 15:04 create_file.sh.bak
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 Phtest1.sh.bak
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 Phtest2.sh.bak
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test1.sh.bak
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test2.sh.bak

xargs 方式实现:

[mysql@mysql test]$ find /home/mysql/test -mindepth 1 -maxdepth 1 -name '*sh' -type f
/home/mysql/test/create_file.sh
/home/mysql/test/Phtest1.sh
/home/mysql/test/Phtest2.sh
/home/mysql/test/test1.sh
/home/mysql/test/test2.sh
[mysql@mysql test]$ 
[mysql@mysql test]$ find /home/mysql/test -mindepth 1 -maxdepth 1 -name '*sh' -type f|xargs -I file sh -c "mv file file.bak"
[mysql@mysql test]$ ls -l|grep -i bak
-rwxrwxr-x 1 mysql mysql 278 12 月 28 15:04 create_file.sh.bak
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 Phtest1.sh.bak
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 Phtest2.sh.bak
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test1.sh.bak
-rw-rw-r-- 1 mysql mysql   0 12 月 28 15:04 test2.sh.bak

**6. **查找查找 /home/mysql/test 目录下所有 .bak 结尾的文件列表,并指定文件类型为文件,不查找 /home/mysql/test 目录下的子目录,并将查找到的文件直接删除,这个操作,经常用于清理应用日志,也可以加上 -mtime,查找 N 天之前的文件进行删除。

[mysql@mysql test]$ find /home/mysql/test -mindepth 1 -maxdepth 1 -name '*.bak' -type f  
/home/mysql/test/create_file.sh.bak
/home/mysql/test/Phtest1.sh.bak
/home/mysql/test/Phtest2.sh.bak
/home/mysql/test/test1.sh.bak
/home/mysql/test/test2.sh.bak
[mysql@mysql test]$ 
[mysql@mysql test]$ find /home/mysql/test -mindepth 1 -maxdepth 1 -name '*.bak' -type f |xargs rm -rf 
[mysql@mysql test]$ ls -l|grep -i bak
[mysql@mysql test]$

2. awk

awk 的功能可以说是非常强大的,要是详细介绍 awk,可以写一本书,在这里,我就介绍一下常用的一些用法吧。
1. 指定打印 ls -l 输出列

[mysql@mysql test]$ ls -l|grep -i test|awk '{print $9}'
test10.sql
test3.log
test4.log
test5.log
test6.log
test7.log
test8.sql
test9.sql

2. 字符串拼接

[mysql@mysql test]$ ls -l|grep -i test|awk '{print "rm -rf "$9}'
rm -rf test10.sql
rm -rf test3.log
rm -rf test4.log
rm -rf test5.log
rm -rf test6.log
rm -rf test7.log
rm -rf test8.sql
rm -rf test9.sql

3. 打印单引号、双引号,这个功能在维护数据库时,有时候非常有用,例如拼接 SQL

[mysql@mysql test]$ ls -l|grep -i test|awk '{print "'\''"$9"'\''"}'
'test10.sql'
'test3.log'
'test4.log'
'test5.log'
'test6.log'
'test7.log'
'test8.sql'
'test9.sql'
[mysql@mysql test]$ ls -l|grep -i test|awk '{print "\""$9"\""}'    
"test10.sql"
"test3.log"
"test4.log"
"test5.log"
"test6.log"
"test7.log"
"test8.sql"
"test9.sql"

3. sed

sed 在处理文件替换的时候是一把好手,非常好用的一个文件编辑利器。
在介绍 sed 案例之前,先准备一个文件,文件内容如下所示:

[mysql@mysql test]$ cat line.txt 
line1
line2
LINE3
line4
LIne5
line6
line7

1. 删除 line.txt 文件中的空行

[mysql@mysql test]$ sed '/^ *$/d' line.txt    
line1
line2
LINE3
line4
LIne5
line6
line7
[mysql@mysql test]$ 
[mysql@mysql test]$ cat line.txt 
line1
line2
LINE3
line4
LIne5
line6
line7

从上面的结果可以看到,源文件 line.txt 的内容并没有发生改变,如果让修改生效,可以加 -i 参数,直接修改源文件内容,如果不加,则不会修改源文件。

[mysql@mysql test]$ sed -i '/^ *$/d' line.txt 
[mysql@mysql test]$ cat line.txt 
line1
line2
LINE3
line4
LIne5
line6
line7

2. 将 line.txt 文件里,所有 line 字符串替换为 test

[mysql@mysql test]$ sed -i 's/line/test/g' line.txt        
[mysql@mysql test]$ cat line.txt 
test1
test2
LINE3
test4
LIne5
test6
test7

3. 删除含有 LINE 字符串的行记录

[mysql@mysql test]$ sed '/LINE/d' line.txt    
test1
test2
test4
LIne5
test6
test7

4. 查找 LINE 字符串上一行

[mysql@mysql test]$ cat line.txt 
test1
test2
LINE3
test4
LIne5
test6
test7
[mysql@mysql test]$ sed -n '/LINE3/{g;1!p;};h' line.txt
test2

5.查找 LINE 字符串下一行

[mysql@mysql test]$ cat line.txt 
test1
test2
LINE3
test4
LIne5
test6
test7
[mysql@mysql test]$ sed -n '/LINE3/{n;p}' line.txt 
test4

4. vi

vi 是 linux 系统非常强大的编辑命令,熟练掌握 vi 命令,对于运维人员来说,是一项必备的技能。
测试 line.txt 文件内容

[mysql@mysql test]$ cat line.txt 
test1
test2
LINE3
test4
LIne5
test6
test7

1.显示行号和关闭行号set nu 显示行号 set nonu 关闭行号

1 test1
      2 test2
      3 LINE3
      4 test4
      5 LIne5
      6 test6
      7 test7
 :set nu

2.光标跳转到最后一行进入编辑模式,敲击 shift+g
3.光标跳转到第一行进入编辑模式,敲击 gg,光标即可跳转到首行
4.光标跳转到行首进入编辑模式,敲击 shift + ^
5.光标跳转到行尾进入编辑模式,敲击 shift + $
6.删除操作进入编辑模式,敲击 dd 则删除光标所在行,敲击 x,则删除光标所在字符
7.替换进入编辑模式,先敲击 shift + :,然后输入%s/test/jim/g,进行全局替换,如果输入 s/test/jim/,则只替换光标所在行
8.保存进入编辑模式,先敲击 shift +:,然后输入 wq!,保存退出,如果不想保存,则可以输入 q!,直接退出。

5. ps

ps 命令是展示操作系统进程信息的一个命令。
4.查找最损耗内存的前 10 的进程

[root@192 ~]# ps aux|sort -nr -k4|head -10
root      50929  0.3  9.1 679612 91068 ?        Ssl  9 月 03   8:25 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
mysql     40333  0.4  7.9 1694620 79320 ?       Sl   9 月 02  16:52 /u02/mysql/bin/mysqld --defaults-file=/u02/conf/my3308.cnf --basedir=/u02/mysql --datadir=/u02/data/3308 --plugin-dir=/u02/mysql/lib/plugin --log-error=/u02/log/3308/error.log --open-files-limit=65535 --pid-file=/u02/run/3308/mysqld.pid --socket=/u02/run/3308/mysql.sock --port=3308
polkitd   95030  1.8  7.1 1587420 71132 ?       Ssl+ 9 月 04  27:57 mongod --bind_ip_all
root        957  0.0  1.1 499804 11904 ?        Ssl  8 月 31   4:45 /usr/bin/containerd
mysql     40532  0.0  0.6 163420  6416 pts/4    S+   06:26   0:00 /u02/mysql/bin/mysql -uroot -px xx --socket=/u02/run/3308/mysql.sock
root      43302  0.0  0.5 159396  5964 ?        Ss   07:20   0:00 sshd: jim [priv]
root      36507  0.0  0.5 159396  5964 ?        Ss   05:16   0:00 sshd: jim [priv]
root      33300  0.0  0.5 102896  5520 ?        S    04:21   0:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf /var/lib/NetworkManager/dhclient-97308c9f-82a6-4ab2-84a9-37bf5691a1e8-ens33.lease -cf /var/lib/NetworkManager/dhclient-ens33.conf ens33
root        706  0.0  0.4 628280  4528 ?        Ssl  8 月 31   0:39 /usr/sbin/NetworkManager --no-daemon
root      43419  0.0  0.4 241196  4628 pts/6    S    07:20   0:00 sudo su - root

5.查找最损耗 CPU 资源的前 10 名进程

[root@192 ~]# ps aux|sort -nr -k3|head -10
polkitd   95030  1.8  7.1 1587420 71132 ?       Ssl+ 9 月 04  27:57 mongod --bind_ip_all
mysql     40333  0.4  7.9 1694620 79320 ?       Sl   9 月 02  16:52 /u02/mysql/bin/mysqld --defaults-file=/u02/conf/my3308.cnf --basedir=/u02/mysql --datadir=/u02/data/3308 --plugin-dir=/u02/mysql/lib/plugin --log-error=/u02/log/3308/error.log --open-files-limit=65535 --pid-file=/u02/run/3308/mysqld.pid --socket=/u02/run/3308/mysql.sock --port=3308
root      50929  0.3  9.1 679612 91068 ?        Ssl  9 月 03   8:25 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root      45144  0.1  0.0      0     0 ?        S    07:52   0:00 [kworker/0:1]
root      44873  0.1  0.0      0     0 ?        S    07:47   0:01 [kworker/0:3]
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        957  0.0  1.1 499804 11904 ?        Ssl  8 月 31   4:45 /usr/bin/containerd
root        956  0.0  0.0  53284   556 ?        Ss   8 月 31   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root        954  0.0  0.2 251796  2780 ?        Ssl  8 月 31   1:31 /usr/sbin/rsyslogd -n
root        953  0.0  0.0 112920   344 ?        Ss   8 月 31   0:01 /usr/sbin/sshd -D

6. lsof

lsof 是 Linux 操作系统中,展示当前系统打开文件的工具,这个工具在运维过程中非常的有用
1.查看占用文件的进程

[root@192 ~]# lsof /u02/run/3308/mysql.sock
COMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
mysqld  40333 mysql   19u  unix 0xffff9cb72ba24400      0t0 443745 /u02/run/3308/mysql.sock
mysqld  40333 mysql   23u  unix 0xffff9cb706041400      0t0 223567 /u02/run/3308/mysql.sock
mysqld  40333 mysql   26u  unix 0xffff9cb72ba24000      0t0 443760 /u02/run/3308/mysql.sock
mysqld  40333 mysql   86u  unix 0xffff9cb701f7e000      0t0 445068 /u02/run/3308/mysql.sock
mysqld  40333 mysql   87u  unix 0xffff9cb73724e000      0t0 445235 /u02/run/3308/mysql.sock

2.查看占用端口的进程

[root@192 ~]# lsof -i :3308
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  40333 mysql   22u  IPv4 223566      0t0  TCP *:tns-server (LISTEN)

3.查看目录被占用的进程,这个在 umount 文件系统时,非常有用

[root@192 ~]# lsof +d /u02
COMMAND     PID  USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
bash      36536  root  cwd    DIR  253,0      169  1002658 /u02
mysqld_sa 39322 mysql  cwd    DIR  253,0       46 67426672 /u02/conf

4.查看目录文件被占用的进程

[root@192 ~]# lsof +D /u02
COMMAND     PID  USER   FD   TYPE             DEVICE   SIZE/OFF      NODE NAME
bash      36536  root  cwd    DIR              253,0        169   1002658 /u02
mysql     38711 mysql  txt    REG              253,0    8142016  36148646 /u02/mysql/bin/mysql
mysql     38720 mysql  txt    REG              253,0    8142016  36148646 /u02/mysql/bin/mysql
mysqld_sa 39322 mysql  cwd    DIR              253,0         46  67426672 /u02/conf
mysqld_sa 39322 mysql  255r   REG              253,0      28466  36258029 /u02/mysql/bin/mysqld_safe
mysqld    40333 mysql  cwd    DIR              253,0        267   1002659 /u02/data/3308
mysqld    40333 mysql  txt    REG              253,0  247739544  36258021 /u02/mysql/bin/mysqld
mysqld    40333 mysql    1w   REG              253,0     278458 105389068 /u02/log/3308/error.log
mysqld    40333 mysql    2w   REG              253,0     278458 105389068 /u02/log/3308/error.log
mysqld    40333 mysql    3u   REG              253,0         35 116292537 /u02/log/3308/binlog/binlog.index
mysqld    40333 mysql    4uW  REG              253,0  536870912   3341676 /u02/log/3308/iblog/ib_logfile0
mysqld    40333 mysql    9uW  REG              253,0  536870912   3341677 /u02/log/3308/iblog/ib_logfile1
mysqld    40333 mysql   10uW  REG              253,0  536870912   3341678 /u02/log/3308/iblog/ib_logfile2
mysqld    40333 mysql   11uW  REG              253,0  536870912   3341679 /u02/log/3308/iblog/ib_logfile3
mysqld    40333 mysql   12uW  REG              253,0   33554432   3341674 /u02/log/3308/iblog/ibdata1
mysqld    40333 mysql   13uW  REG              253,0   83886080   3341675 /u02/log/3308/iblog/ibdata2
mysqld    40333 mysql   15uW  REG              253,0   12582912   1002664 /u02/log/3308/iblog/ibtmp1

7. fuser

fuser 命令用于报告进程使用的文件和网络套接字,使用这个命令,可以非常方便的展示本地进程的进程号,什么本地进程使用文件。
1.列举所有访问/u02/run/3308/mysql.sock 文件进程号以及用户名

[root@192 ~]# fuser -u /u02/run/3308/mysql.sock
/u02/run/3308/mysql.sock: 40333(mysql)

2.列举所有访问文件系统进程号以及用户名

[root@192 ~]# fuser -u -m /home
/home:               36511c(jim) 36534c(root) 37220c(mysql) 37252c(jim) 37279c(root) 37301c(mysql) 38710c(mysql) 38711c(mysql) 38719c(mysql) 38720c(mysql) 40289c(jim) 40314c(root) 40366c(mysql) 40392c(mysql) 40393c(mysql) 40463c(jim) 40486c(root) 40508c(mysql) 40531c(mysql) 40532c(mysql) 43306c(jim) 43329c(root) 43394c(jim) 43419c(root)

3.杀死所有访问 tps_mysql.sh 文件进程,并显示被杀死的进程号

[mysql@192 ~]$ fuser -ku /home/mysql/tps_mysql.sh 
/home/mysql/tps_mysql.sh: 46741(mysql)

8. rpm

rpm 命令 Linux 操作系统 rpm 包管理工具
1.安装 rpm 包

[mysql@192 ~]$ rpm -ivh percona-xtrabackup-24-2.4.2-1.el7.x86_64

2.卸载安装包

[mysql@192 ~]$ rpm -e percona-xtrabackup-24-2.4.2-1.el7.x86_64

3.查询 rpm 安装情况

[mysql@192 ~]$ rpm -qa|grep -i percona
percona-xtrabackup-24-2.4.2-1.el7.x86_64
percona-toolkit-3.1.0-2.el7.x86_64

4.查看 rpm 包文件安装目录

[mysql@192 ~]$ rpm -ql percona-toolkit-3.1.0-2.el7.x86_64
/usr/bin/pt-align
/usr/bin/pt-archiver
/usr/bin/pt-config-diff
/usr/bin/pt-deadlock-logger
/usr/bin/pt-diskstats
/usr/bin/pt-duplicate-key-checker
/usr/bin/pt-fifo-split
/usr/bin/pt-find
/usr/bin/pt-fingerprint
/usr/bin/pt-fk-error-logger
/usr/bin/pt-heartbeat
/usr/bin/pt-index-usage

9. 正则表达式

正则表达式就是为处理大量的字符串而定义的一套规则和方法,从大量的字符串上快速搜索出想要的东西。正则表达式一般以行为单位处理的。
注意事项:

  • Linux 正则表达式一般以行为单位处理的
  • alias grep='grep --color=auto' 让匹配的内容显示颜色
  • 注意字符集,export LC_ALL=C

正则表达式参数

参数 解释
-E, --extended-regexp PATTERN 是一个可扩展的正则表达式(缩写为 ERE)
-F, --fixed-strings PATTERN 是一组由断行符分隔的定长字符串
-e, --regexp=PATTERN 用 PATTERN 来进行匹配操作 pattern
-f, --file=FILE 从 FILE 中取得 PATTERN
-i, --ignore-case 忽略大小写
-w, --word-regexp 强制 PATTERN 仅完全匹配字词
-x, --line-regexp 强制 PATTERN 仅完全匹配一行
-z, --null-data 一个 0 字节的数据行,但不是空行

Miscellaneous(其它的选项):

参数 解释
-s 或–no-messages` 不显示错误信息
-v 或–invert-match` 取反

Output control(输出控制):

参数 解释
-m, --max-count=NUM 达到 NUM 次匹配时停止
-n, --line-number 显示行号
-H, --with-filename 显示匹配结果的文件名
-h, --no-filename 不显示匹配结果的文件名
-o, --only-matching 显示匹配的 PATTERN
-q, --quiet, --silent 安静模式,没有任何一般输出
-a, --text 等价于 --binary-files=text
-d, --directories=ACTION 如何操作目录,ACTION is ‘read’, ‘recurse’, or ‘skip’
-D, --devices=ACTION 如何操作设备
-R, -r, --recursive 目录递归,等同于 --directories=recurse
--include=FILE_PATTERN 只匹配表达式表示的文件
--exclude=FILE_PATTERN 排除表达式表示的文件
--exclude-from=FILE 从文件读取要排除的文件或目录
--exclude-dir=PATTERN 从表达式获取要排除的目录
-L, --files-without-match 打印出内容不匹配的文件名
-l, --files-with-matches 打印出内容匹配的文件名
-c, --count 打印出每个文件匹配到内容的次数
-Z, --null 文件名后面不打印文件

文件控制:

参数 解释
-B, --before-context=NUM 打印出匹配内容行前 NUM 行
A, --after-context=NUM 打印出匹配内容行后 NUM 行
-C, --context=NUM 打印出多少行
–color[=WHEN] 颜色高亮显示
–colour[=WHEN] use markers to highlight the matching strings;WHEN is ‘always’, ‘never’, or ‘auto’

egrep 即 grep -E。fgrep 即 grep -F
提示:正则表达式一般使用单引号引起来,如果里面引用了变量,就用双引号引起来。

10. grep 使用

  1. 找出以 r 开头的行
root@shell1:~# grep '^r' /etc/passwd
root:x:0:0:root:/root:/bin/bash
  1. 找以 login 结尾的行
root@shell1:~# grep 'login$' /etc/passwd
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
  1. 匹配所有大写字母中的一个
root@shell1:~# grep '[[:upper:]]' /etc/passwd
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
  1. 匹配以 rb 开头的行
root@shell1:~# grep '^[rb]' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
  1. 匹配出现两次 o 的行
root@shell1:~# grep 'o\{2\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash 
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
  1. 匹配 1 到 2 次有 o 的行
root@shell1:~# grep 'o\{1,2\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
  1. 出现两次 o 以上的行
root@shell1:~# grep 'o\{2,\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
  1. 匹配 0~9 数字出现 3 次以上的
root@shell1:~# grep '[0-9]\{3,\}' /etc/passwd
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
  1. 找出 root 和 sys 的行
root@shell1:~# grep -E 'root|sys' /etc/passwd
root:x:0:0:root:/root:/bin/bash
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
  1. 找出 root 和 sys 开头的行
root@shell1:~# grep -E '^(root|sys)' /etc/passwd
root:x:0:0:root:/root:/bin/bash
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
  1. 找出两边有:中间夹着 7 或 9 的行
root@shell1:~# cat /etc/passwd | grep -E ':(7|9):'
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
  1. 查看指定的文件 /etc/logrotate.conf 内容,不显示注释行和空白行
cat /etc/logrotate.conf | grep -Ev '^#|^$'
  1. 加入 -c 参数打印出每个文件匹配到内容的次数
root@shell1:~# grep -c 'root' /etc/passwd  #因为只匹配到一行,所以只输出 1
1
  1. 加入 -w 参数只完全匹配字词,如果不是一样的词就不输出
root@shell1:~# grep -w 'bin' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin

猜你喜欢

转载自blog.csdn.net/wohu1104/article/details/114986521