某君面试题之一(获取以"ata"开头运行进程的进程号)

本文介绍如何使用ps、awk、grep和sed等Linux命令查询特定进程,重点讲解了如何精确匹配进程名并提取进程ID,适合于Linux系统管理和运维人员学习。

题目比较简单,这里总结的重点是思路。

一道题目看着简单但实际遇到的时候往往答不好。

第一个要点是不要慌,沉住气,不要管面试官,专注于题目。

其次从题目入手,抓住要点找到答案。

本题要点是获得进程信息并获取进程号,重点是进程输出格式。

获得进程信息我们都知道用“ps aux”来获取。

如上图,格式特点很清晰。(在答题的时候脑海中要清晰展现,尤其是细节。因为注意到细节才能精准匹配)

信息以空格为分割按列显示信息。

第二列是最终需要的进程号(PID),最后一列(第11列)是进程名

处理列是awk命令的擅长,因此第一感觉是用awk来处理。

接下来就是需要梳理一下处理过程,大致如下:

1.ps输出信息,通过管道交给awk

2.awk判断条件:以"ata"开头的进程

3.将符合条件的pid输出

分步实现:

1.这步使用ps aux实现

   ps axu | awk...

这里略作说明:

a是获取了全部用户的进程

x是剔除了终端进程

u以面向用户方式输出

2.awk接收管道信息并做安段

ps aux | awk -F " " '($NF~/\[ata/){... }'

awk做了正则判断,$NF代表最后一列(进程名),条件是“\[ata”。

其中“[”是每个进程系统输出是添加的,在这里还需要进行转义,即"\["。

完整条件用一对"/"包括起来

3.输出

ps aux | awk -F " "  '($NF~/\[ata/){print $2 " " $NF }'

按列输出是awk的强项,这里明确指出用" "作为分隔,其实默认也是“ ”不写也可以。

大括号内是执行输出,print $2 " " $NF

这里了验证正确性,将进程名也输出了,答题时不需要输出$NF

就是这么简单。说简单也不简单,如果是上机做题应该很容易,因为执行中会验证你的错误,很快可以修正。

口答和笔答要难了。要能记住各种细节,这需要多多练习,在反复犯错误中加深印象。

------------------------------------------下面是多余的不看也可以---------------------------------------------------------------------------------

既然说了awk,也想顺便复习一下grep和sed

先说说grep。用它也可以实现吧,试试看。

过滤条件依然是“\[ata”,依然是需要转义的

ps aux |grep "\[ata"

结果里面有2个,多出来一个grep自己执行的进程,所以还需要排除掉

ps aux |grep "\[ata"| grep -v "grep"

这次是唯一的,最后就是将pid取出的问题了。用awk当然很容易,上面已经实现了。

这里虐心一下,不用awk来实现。

cut也可以用来切分一行文本,不过本例中分隔符“ ”数量不均匀,需要处理一下再用cut

将重复字符合并可以使用sed来实现,下面给出一个例子:

ps aux |grep "\[ata"| grep -v "grep" |sed -e 's/  */#/g'

这个效果是将分割符由不确定数量的“ ”替换为“#”

这样再利用cut就可以实现最终目标了

ps aux |grep "\[ata"| grep -v "grep" |sed -e 's/  */#/g'|cut -d "#" -f2

在实践中这个方法不简便,这里只是作为头脑体操来练习练习。

----------------------------------------------最后用sed来搞搞-------------------------------------------------------------------------------

先实现将包含“[ata”的行找出来

ps aux | sed -n '/\[ata/p'

我们看到结果有不需要的进程,即sed自己,我们做一下排除,这里不使用grep实现。

ps aux | sed -n '/\[ata/p' | sed '/sed -n/d'

最后就是取列值了。上面已经用awk和cut两种方法实现。

这里我们使用sed实现该功能。

ps aux | sed -n '/\[ata/p'|  sed  '/sed -n/d' |sed   's/\(^[a-z]*\) *\(\b[0-9]\{1,3\}\b\)\( *.*\]$\)/\2/g'

基本思路是将本行字符分成三部分最后用第二部分取代整行内容。

第一部分是字母开头,空格若干

第二部分是数字3位以内,这里注意可能大于3位,这里没有去追究可能为4位或更高位。

第三部分是空格开始,“]”结束

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值