题目比较简单,这里总结的重点是思路。
一道题目看着简单但实际遇到的时候往往答不好。
第一个要点是不要慌,沉住气,不要管面试官,专注于题目。
其次从题目入手,抓住要点找到答案。
本题要点是获得进程信息并获取进程号,重点是进程输出格式。
获得进程信息我们都知道用“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位或更高位。
第三部分是空格开始,“]”结束