仅打印第一次匹配

仅打印第一次匹配

我有一个代码片段,用于解析日志文件并打印我需要的信息。

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/ {print $7}' 
 done;

问题是当我输入时,它会多次显示答案:

(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.284.3.17454802.933.1401109176.280.1)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.284.3.17454802.933.1401109176.283.1)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109696.2)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109706.51)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109758.100)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109773.149)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109810.198)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109818.247)

有什么方法可以修剪它,以便只显示一次第一组数据。我只需要1.3.51.0.1.1.10.10.30.48.2084865.2084839打印一次。

我也尝试将其改为这样,但是 Bash 不喜欢它:

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/' |
        awk -F'[(/]' ' {print $2, exit}'
done;

然后尝试了这个:

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk -F'[(/]' '/\([a-zA-Z0-9.]+/ {print $2, exit }'
done;

答案1

尝试这个,

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/ {print $7; exit}' 
done;

exit在打印第一个匹配项后,awk 命令退出。

或者

只需将命令的输出通过管道传输for到下面的 awk 命令即可,

for .... | awk -F'[(/]' '{print $2;exit}'

答案2

您不需要for循环 - 一次调用grep将输出文件中的所有匹配行,因此您只需重复相同的操作,次数与文件中的行数相同。

从技术上讲,您不需要两者awkgrep两者之一,因为两者都可以进行文本匹配。如果您想要更具体的答案,请发布日志文件的摘录和您想要的输出示例。

答案3

你还没有解释你实际上在做什么,所以我会做几个假设。我假设你正在运行一个名为的脚本foo.sh,并给它一个字符串和一个文件名作为参数。然后它们分别变成$1$2。大概,你正在用类似的东西来运行它

foo.sh SearchPattern LogFileName

无论如何,for循环是 i) 完全无用的,因为你没有使用循环i创建的变量for i in ...。ii) 非常错误,因为这将使i每个单词而不是整行,而这可能是您想到的 iii) 所有问题的原因。您多次得到相同的结果,因为您多次运行完全相同的命令。您将为文件的每一行获得一个结果。

无论如何,你想要的东西可以用简单的事情来完成

grep "$1" ~/jlog/"$2" | awk '/\([a-zA-Z0-9.]+/ {print $7}' 

或者更简单:

awk '/'"$1"'/\([a-zA-Z0-9.]+/ {print $7}' ~/jlog/"$2"

awk注意, 不在"$1"单引号内。这会使 bash 将其扩展为 中当前包含的内容,$1然后再将其传递给awk

相关内容