在标记/已知值之前检索单词

时间:2019-02-05 02:07:39

标签: bash

我有一个包含以下文本的文本文件。我想从每行中检索Infra之前的单词:

        awesomebitchesz2.0  Infra  6     54 Mbit/s   79      ▂▄▆_  WPA2        
*       Bourbonhouse        Infra  6     130 Mbit/s  70      ▂▄▆_  WPA2        
        --                  Infra  6     130 Mbit/s  34      ▂▄__  WPA2 802.1X 

文件的基数保持不变,但名字始终更改,我希望能够提取特定AP的名称。例如我想grep Bourbonhouse,它将打印出现在带有空白的bourbonhose 我想尝试将Infra之前的第一项工作作为指标,但是我看到的所有解决方案都只能在指标之后进行。有人可以向我指出正确的方向还是给我示范。

3 个答案:

答案 0 :(得分:0)

假设AP名称中没有空格,您可以像这样使用cut

$ cat filename.txt | cut -c9- | cut -f1 -d ' '
awesomebitchesz2.0
Bourbonhouse
--

答案 1 :(得分:0)

在每种情况下,使用shell原生正则表达式来检索System.Exception之前的单词可能是这样的:

Infra

您可以在https://ideone.com/TmVO5J

上看到带有输入的内容

如果您的目标是仅捕获前面带有re='[[:space:]]([^[:space:]]+)[[:space:]]+Infra' while IFS= read -r line; do [[ $line =~ $re ]] && echo "${BASH_REMATCH[1]}" done 的名称,则可能类似于:

*

可以在https://ideone.com/VcoYM5上看到此版本

答案 2 :(得分:0)

我认为在这里使用sed正则表达式可能是最好的选择,因为它允许您提取特定的组。这是我想出的:

sed -n 's/[\*\ ]*\(.*\) Infra.*$/\1/p'

这是正在使用的正则表达式:

$ echo | sed -n 's/[\*\ ]*\(.*\) Infra.*$/\1/p' <<EOF
        awesomebitchesz2.0  Infra  6     54 Mbit/s   79      ▂▄▆_  WPA2
*       Bourbonhouse        Infra  6     130 Mbit/s  70      ▂▄▆_  WPA2
        --                  Infra  6     130 Mbit/s  34      ▂▄__  WPA2 802.1X
EOF
awesomebitchesz2.0
Bourbonhouse
--

作为奖励,这将处理AP名称中包含空格的情况:

$ echo | sed -n 's/[\*\ ]*\(.*\) Infra.*$/\1/p' <<EOF
        awesomebitchesz2.0  Infra  6     54 Mbit/s   79      ▂▄▆_  WPA2
*       Bourbonhouse        Infra  6     130 Mbit/s  70      ▂▄▆_  WPA2
        Space  Wayzz        Infra  6     130 Mbit/s  34      ▂▄__  WPA2 802.1X
EOF

awesomebitchesz2.0
Bourbonhouse
Space  Wayzz