我有以下文本的文本文件。我只想从每行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与现在空格我想通尝试和红外前拉的第一部作品作为指标,但所有的解决方案,香港专业教育学院看到的只是指标后拉。可有人要么点我在正确的方向,或给我示范。
使用壳原生的正则表达式来检索在每种情况下可能看起来像到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可见
假设有在AP的名称没有空格,您可以使用cut
这样的:
$ cat filename.txt | cut -c9- | cut -f1 -d ' '
awesomebitchesz2.0
Bourbonhouse
--
我想用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