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

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

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

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

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

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

获得进程信息我们都知道用“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位或更高位。

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

发布了53 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/bigwood99/article/details/104569482