【问题标题】:using awk to print partly match in column使用 awk 在列中打印部分匹配
【发布时间】:2021-05-05 18:10:55
【问题描述】:

我正在尝试使用 awk 打印与存储在变量 $file_log 中的文件中特定数据列 ($4) 中的模式匹配的任何匹配项。比赛也必须是部分的和不区分大小写的。这是文件数据。

Protocol    Packets    Bytes    SourceIP
TCP         120        1000     EXT_SERVER
TCP         33         230      EXT_SERVER
UDP         260        157      100012_SERVER
ICMP        340        89       100012_SERVER

因此,如果用户在以下代码中提供“ex”的输入,则输出将显示 $4 列下所有带有 EXT_SERVER 的行。

read -p 'Type the Source IP code you wish to search for: ' src_ip_choice

这是我到目前为止所拥有的,但是没有输出,即使肯定有与我输入的模式匹配的数据......

read -p 'Type the Source IP code you wish to search for: ' src_ip_choice
if grep -i -q "$src_ip_choice" "$specified_log"; then
    awk -F',' '$4~/$src_ip_choice/' $specified_log
else
    echo "The Source IP code you entered cannot be found within $specified_log"

附:我知道 $4 列不需要指定为 'EX' 无论如何只出现在 $4 中。但是,这是一项要求。

任何帮助将不胜感激!

【问题讨论】:

  • 请阅读how-do-i-find-the-text-that-matches-a-pattern 以了解您的问题的问题,然后将“模式”一词替换为您问题中出现的任何地方的 regexp-or-string 和 full-or-partial 并包括 regexp要匹配“模式”中的元字符,以便我们可以看到您希望如何处理(例如,src_ip_choice 中的 e. 是否应与来自 extex 和来自 serverer 匹配? )

标签: awk


【解决方案1】:

您可以使用awk 在第 4 列忽略大小写匹配:

s='[Ee][Xx]' # or read from user

awk -v re="$s" 'tolower($4) ~ tolower(re)' file

TCP         120        1000     EXT_SERVER
TCP         33         230      EXT_SERVER

$4 是第 4 列,/[Ee][Xx]/ 匹配第 4 列中的 exEXExeX

【讨论】:

  • 嗨@anubhava 有没有一种方法可以根据存储在“src_ip_choice”变量中的用户提供的模式进行 awk 搜索
  • 感谢您的帮助@anubhava !如果我使用包含用户输入的变量而不是“[Ee][Xx]”,我怎样才能使这种情况不区分大小写?
  • 当然可以:awk -v re="$s" 'tolower($4) ~ tolower(re)' file
  • 或与 gawk awk -v IGNORECASE=1 -v re="$s" '$4 ~ re' file。我想知道 OP 是否真的想要一个正则表达式比较 - 我们无法从“模式”中分辨出来......
猜你喜欢
  • 1970-01-01
  • 2021-11-26
  • 2018-02-19
  • 2015-02-04
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多