将两个greps和awk应用于相同的输入

时间:2012-09-22 23:58:12

标签: linux bash unix

我在python脚本中使用两个简短的UNIX命令来获取有关附近无线接入点的一些数据。

  • n°1,获取接入点的ESSID:

"iwlist NIC scan | grep ESSID | awk '{print $1}'"

  • n°2,获取接入点的信号强度:

"iwlist NIC scan | grep level | awk '{print $3}'"

我的问题是我一个接一个地使用这两个命令,这意味着它不会生成“对称”数据。您可能会获得6个ESSID和4个信号强度数据。

因为第一次,脚本找到6个AP(A,B,C,D,E和F),下次只有4个AP(A,C,E和F)。

我的一些问题如下:

  • 有没有办法“拆分”第一个iwlist NIC scan的结果,然后将两个不同的grepawk序列应用于同一个输入?

这样你至少得到一个对称的结果列表。

提前谢谢!

3 个答案:

答案 0 :(得分:10)

如何将awk用作grep

iwlist NIC scan | awk '/ESSID/ {print $1} /level/ {print $3}'

这样可以同时为您提供ESSID和等级线。你可能想要更复杂一点,至少用它代表的东西标记线条;选项很多。从您的代码中不清楚您将如何使用输出,所以我不打算尝试再次猜测如何最好地呈现它(但我希望网络ID和级别在同一条线上会是一个很好的输出 - 它是可行的。)

答案 1 :(得分:4)

通常,您可以使用tee和流程替换来完成此类路由:

iwlist NIC scan | tee >( grep -i ESSID | awk '{print $1}' ) | grep -i level | awk '{print $3}'

但由于以下几个原因,这种情况较差:

  1. grep是多余的,因为awk可以自行进行过滤
  2. 正如Jonathan Leffler指出的那样,这两个分支相似,足以折叠成一个awk命令。
  3. 两个输出流以非确定性方式合并在一起,因此可能很难或不可能确定哪个级别对应于哪个ESSID。将每个分支的输出存储在一个文件中,然后逐行进行匹配会有所帮助,但这比asgs的解决方案要好得多。
  4. 但是将一个命令的输出传递给两个不同的管道而没有显式临时文件的技术在其他地方可能会有用;认为这个答案只是一个示范。

答案 2 :(得分:1)

#!/bin/bash
iwlist <NIC> scan > tmpfile
grep -i ESSID tmpfile | awk '{print $1}'
grep -i level tmpfile | awk '{print $3}'
rm tmpfile

像这样的脚本可能就是你所期待的。