只是一个印记/已知值之前检索字

问题描述 投票:-2回答:3

我有以下文本的文本文件。我只想从每行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 

该文件的基本保持不变,但alwasy变化的第一个名字,我希望能够拉动一定的AP的名称。比如我想给grep Bourbonhouse它会打印出bourbonhose与现在空格我想通尝试和红外前拉的第一部作品作为指标,但所有的解决方案,香港专业教育学院看到的只是指标后拉。可有人要么点我在正确的方向,或给我示范。

bash
3个回答
0
投票

使用壳原生的正则表达式来检索在每种情况下可能看起来像到Infra之前的话:

re='[[:space:]]([^[:space:]]+)[[:space:]]+Infra'
while IFS= read -r line; do
  [[ $line =~ $re ]] && echo "${BASH_REMATCH[1]}"
done

你可以看到这与您在https://ideone.com/TmVO5J输入运行


如果你的目标是用*之前只捕捉的名字,可能是这样的:

re='^[[:space:]]*[*][[:space:]]*([^[:space:]]+)[[:space:]]+Infra'
while IFS= read -r line; do
  [[ $line =~ $re ]] && { result="${BASH_REMATCH[1]}"; break; }
done

if [[ $result ]]; then
  echo "Found result: $result"
else
  echo "No result found"
fi

这个版本可以在https://ideone.com/VcoYM5可见


0
投票

假设有在AP的名称没有空格,您可以使用cut这样的:

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

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
© www.soinside.com 2019 - 2024. All rights reserved.