grep -v 在从 iwconfig 进行管道传输时不起作用,但在从文件上的 cat 进行管道传输时起作用

grep -v 在从 iwconfig 进行管道传输时不起作用,但在从文件上的 cat 进行管道传输时起作用

我正在运行iwconfig | grep -v "no wireless extensions",但无法让 -v 选项按预期工作。我想排除包含“无无线扩展”的行,即,我想仅显示活动/工作无线接口或任何应调用的接口。

一开始我认为命令输出到的流可能与通过管道传输到 grep 的流不同,所以我尝试了cat myFile | grep -v myExclusionPattern。这按预期工作,所以我得出的结论-v是它达到了我的预期。然后我iwconfig | grep "no wireless extensions"再次尝试,结果是预期的 - 这意味着 iwconfig 的输出是通过管道传输到 grep 的。所以我留下了一个问题,为什么在管道传输to-v的结果时具体不起作用。iwconfiggrep

这是我对 iwconfig 的输出:

enp4s0    no wireless extensions.

docker0   no wireless extensions.

lo        no wireless extensions.

wlp5s0    IEEE 802.11  ESSID:"myEssid"  
          Mode:Managed  Frequency:5.24 GHz  Access Point: 74:83:C2:75:86:2A   
          Bit Rate=6 Mb/s   Tx-Power=30 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
          Link Quality=59/70  Signal level=-51 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:747   Missed beacon:0

总结:

  1. grep -v当我通过管道输出grep带有cat.
  2. iwconfig当通过管道传输to的输出时,我无法重现与 (1) 中相同的行为grep

我在 grep -v 上阅读了以下问题,但无法在其中任何一个中找到上述问题的答案:

答案1

iwconfig输出到标准输出和标准错误,具体取决于是否找到接口的任何无线扩展。管道仅影响标准输出。

删除发送到标准错误流的输出的示例(仅显示具有无线扩展的接口):

$ /usr/sbin/iwconfig 2>/dev/null
wlp4s0    IEEE 802.11  ESSID:off/any
          Mode:Managed  Access Point: Not-Associated   Tx-Power=22 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

删除发送到标准输出流的输出的示例(仅显示iwconfig未能找到无线扩展的接口):

$ /usr/sbin/iwconfig >/dev/null
lo        no wireless extensions.

enp0s31f6  no wireless extensions.

wwan0     no wireless extensions.

docker0   no wireless extensions.

br-ca679f9ee354  no wireless extensions.

veth232fd86  no wireless extensions.

vboxnet0  no wireless extensions.

答案2

我看到没有人提到这种替代方案,但我会考虑使用

iwconfig 2>&1 | grep -v "no wireless extensions"也是一个解决方案(也许更优雅?)

现在,错误和常规输出都被发送到相同的文件描述符(标准输出),这就是通过管道传输到 grep 的内容,它最终可以过滤整个数据。

相关内容