前言
- 在
Linux
中使用脚本命令时,经常见到ps -ef|grep -v grep|awk '{print $2}'
这一句命令- 前半部分的
ps -ef|grep
命令,相信经常接触Linux
的人肯定明白,但是后半部分的两次grep
管道过滤就有点云里雾里- 后边的命令可以拆分为两段,分别是
grep -v grep
和awk '{print $2}'
,下边将分开阐述两端命令的作用- 本文参考博客
第一步:grep -v grep
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
ps -ef|grep java
就是通过管道的方式,将ps
命令查询出来的进程信息内容筛选出与Java
相关的数据但是使用
grep
命令过滤时会查询出grep
自己的进程信息,示例如下:[root@localdomain1 ~]# ps -ef|grep xh-1.0-SNAPSHOT.jar root 3256 1 0 Aug11 ? 00:17:19 java -jar xh-1.0-SNAPSHOT.jar --spring.config.location=application.yml root 6435 6395 0 08:38 pts/1 00:00:00 grep --color=auto xh-1.0-SNAPSHOT.jar
可以看到在查询到的进程信息中,除了我们需要的
xh-1.0-SNAPSHOT.jar
进程,还包括了grep
进程信息大多数情况下,在编写脚本时,往往只需要通过这条命令精确获取到某一个进程的信息,此时就需剔除掉多余的
grep
进程的信息数据
-v
参数,作用是反转查找,即过滤出除了参数后面的其他数据,示例如下[root@localdomain1 ~]# ps -ef|grep xh-1.0-SNAPSHOT.jar |grep -v grep root 3256 1 0 Aug11 ? 00:17:19 java -jar xh-1.0-SNAPSHOT.jar --spring.config.location=application.yml
可以发现,当我们在命令后面添加
|grep -v grep
后,查询出来的数据只有我们需要的xh-1.0-SNAPSHOT.jar
进程信息,说明grep
已经被排除在外了
第二步:awk '{print $2}'
awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
awk处理过程: 依次对每一行进行处理,然后输出
print & $0 是awk打印指定内容的主要命令
在第一步中,我们查询出来了
jar
进程的唯一进程信息,此时在脚本中需要获取到这条进程信息的进程PID就可以使用到
awk
命令将自己需要的某一列参数单独提取出来[root@localdomain1 ~]# ps -ef|grep xh-1.0-SNAPSHOT.jar|grep -v grep|awk '{print $2}' 3256
$2
代表提取结果中第二列的值,而在ps
命令中的第二列对应的正是进程的PID(注意:$0
表示整个当前行)可以看到,通过
awk '{print $2}'
命令我们成功拿到了xh-1.0-SNAPSHOT.jar
进程PID的值
类似脚本示例(脚本来源)
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
标签:ps,grep,ef,jar,awk,print
From: https://www.cnblogs.com/suhai/p/16585787.html