Linux shell脚本:如何以整数(但只有数字)存储终端的输出?

时间:2016-08-10 15:04:59

标签: linux bash shell io scripting

我是shell脚本的新手,这是我的问题:
我想将airmon-ng check的输出中的PID存储到某些变量(例如:$ 1,$ 2,$ 3),以便我可以执行kill $1 $2 $3。 这是airmon-ng check的示例输出:

Found 3 processes that could cause trouble.
If airodump-ng, aireplay-ng or airtun-ng stops working after
a short period of time, you may want to kill (some of) them!

  PID Name
  707 NetworkManager
  786 wpa_supplicant
  820 dhclient

我想抓取数字 707 786 820
我尝试使用set 'airmon-ng check'然后使用for循环:

set `airmon-ng check`
n=$#
for (( i=0; i<=n; i++ ))
do
        echo $i
done

输出1,2,3,...... 36 不是文字或数字,所以我无法弄清楚我应该怎么做。

4 个答案:

答案 0 :(得分:1)

您可以获取以空格分隔的PID列表,例如像这样(#34之后的第1列; PID&#34;):

l=`airmon-ng check | awk 'BEGIN { p=0 } { if (p) { print $1" "; } if ($1=="PID") { p=1 } }' | tr '\n' ' '`

答案 1 :(得分:1)

airmon-ng check | egrep -o '\b[0-9]+\b' | xargs kill

egrep是带有扩展正则表达式的grep(例如grep -E),-o表示只提取匹配的部分,\b匹配字边界,因此您不会t在进程名称或其他内容中意外发生任何数字,[0-9]+匹配一个或多个十进制数字,xargs kill将所有匹配作为参数传递给kill命令。

请注意,解析旨在由人类阅读的输出可能并不总是一个好主意。而且,只是杀死所有这些过程并不会听起来太聪明,但正确使用airocrack是不可能的。

答案 2 :(得分:0)

我会使用awk并将输出存储在数组

pids=( $(airmon-ng check | awk '/^[[:blank:]]+[[:digit:]]+[[:blank:]]+/{print $1}') )
#'pids' is an array
kill "${pids[@]}" #killing all the processes thus found.

答案 3 :(得分:0)

为什么不使用grep?

myvar=$(airmon-ng check | grep '[0-9]\{3,6\}')

这假定PID为3到​​6位,并且将从类似长度的airmon-ng输出中获取任何内容。因此,如果输出包含具有相似长度的数字的其他字符串,则这可能不起作用。