咱今天先从一个命令讲起,先看一个命令:
1 | ps -ef|grep nginx|awk '{print $2}'|xargs sudo kill -9 |
上面这条命令使用了管道组合了多个命令,作用是找个所有进程名字包含 nginx 的进程,然后 kill 这些进程。
1.首先是ps这个命令,简单的说是查看当前系统进程。
1 | Usage: ps [OPTION] |
在Linux的世界里,一个看似简单的命令,其背后的参数十分丰富,功能十分强大,如果你 man 一下这个命令,其手册打印出来估计有几十页,参数多达几十个,估计能记住的人不多,
但是好在平时我们只用到其中几个参数就够用了。所以这里我也只是简单说下常用参数和常见应用场景,详细命令可以man或者help。
对于ps这个命令,按照手册的说法,它有不同的风格,有适合UNIX,有适合BSD,一般来说,ps -axu 和 ps -ef 效果是一样的。
其结果如下:
1 | UID PID PPID C STIME TTY TIME CMD |
2.grep命令
1 | Usage: grep [OPTION]... PATTERN [FILE]... |
这个命令是用来搜索文本内容,支持丰富的参数, 最简单的用法:
1 | jwang@jwang:~$ grep server /etc/nginx/nginx.conf |
上面的命令是打印出nginx.conf文件里面所有包含server文字的行,默认情况下,这个搜索是模糊匹配,而且是区分大小写的。
常用参数:
1 | -i :不忽略大小写 |
这个还支持正则表达式搜索,我平时用的少,大部分时候普通字符串就够用了。
还有几个挺有意思的参数:
1 | -B, --before-context=NUM 打印出搜索结果的前NUM行 |
举个例子 grep -C 2 jwang /etc/passwd
1 | jwang@jwang:~$ grep -C 2 jwang /etc/passwd |
所以 ps -ef|grep nginx
的结果如下:
1 | root 26642 1 0 17:36 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; |
3.awk命令
Awk是一种便于使用且表达能力强的程序设计语言,可应用于各种计算和数据处理任务。
看这介绍就知道awk多强大,都上升到语言的层次,先说说一开始的命令里面用法: awk '{print $2}'
默认情况下,awk使用 空格 去分割字符串,把上面的结果每一行按照空格去分割成N块,其中$0代表字符串本身,$1代表第一个块,$2代表第二个块,以此类推….
所以ps -ef|grep nginx|awk '{print $2}'
的结果是:
1 | 26642 |
awk常用参数:
1 | 1. -F fs or --field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式 |
关于awk脚本,我们需要注意两个关键词BEGIN和END。
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
1 | $ cat score.txt |
我们的awk脚本如下:
1 | $ cat cal.awk |
我们来看一下执行结果:
1 | $ awk -f cal.awk score.txt |
再看一个案例,查出nginx日志里面状态为500的请求:
1 | awk '$9 == 500 {print $0}' /var/log/nginx/access.log |
awk还支持常见的if while等逻辑控制语句。
4.xargs命令
1 | Usage: xargs [OPTION]... COMMAND [INITIAL-ARGS]... |
这个命令作用是使用接收的内容当作参数去执行一条命令,一般都是配合管道使用,比如说在上面的例子里面,xargs的作用就是接收前面的pid,然后执行kill命令。
再看个例子: sudo find / -name nginx |xargs ls -l
这个命令意思是列出所有目录名或者文件名包含nginx的详情,其结果大概是这样:
1 | -rw-r--r-- 1 root root 389 2月 12 2017 /etc/default/nginx |
所以,最后的xargs命令是把前面筛选得到的pid作为参数传给命令kill执行,有时候会有权限问题,所以这里加了个sudo。