首页 > 解决方案 > 使用 awk 在列中打印部分匹配

问题描述

我正在尝试使用 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"

PS 我知道列 $4 不需要指定为“EX”,无论如何只出现在 $4 中。但是,这是一个要求。

任何帮助将不胜感激!

标签: awk

解决方案


您可以将其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 列中的exorEXExor eX


推荐阅读