首页 > 解决方案 > 检索印记/已知值之前的单词

问题描述

我有一个包含以下文本的文本文件。我想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 它会打印出带有空格的波旁酒,我想尝试在 Infra 之前将第一个工作拉为指标,但我看到的所有解决方案都只在指标之后拉。有人可以指出我正确的方向或给我一个示范。

标签: bash

解决方案


在每种情况下,使用 shell-native 正则表达式来检索之前的单词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看到


推荐阅读