先用一个脚本,模拟创建 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 使用
- 找出以 r 开头的行
root@shell1:~# grep '^r' /etc/passwd
root:x:0:0:root:/root:/bin/bash
- 找以 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
- 匹配所有大写字母中的一个
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
- 匹配以 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
- 匹配出现两次 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 到 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
- 出现两次 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
- 匹配 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
- 找出 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
- 找出 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
- 找出两边有:中间夹着 7 或 9 的行
root@shell1:~# cat /etc/passwd | grep -E ':(7|9):'
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
- 查看指定的文件 /etc/logrotate.conf 内容,不显示注释行和空白行
cat /etc/logrotate.conf | grep -Ev '^#|^$'
- 加入
-c
参数打印出每个文件匹配到内容的次数
root@shell1:~# grep -c 'root' /etc/passwd #因为只匹配到一行,所以只输出 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