我有一个代码片段,用于解析日志文件并打印我需要的信息。
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
将输出文件中的所有匹配行,因此您只需重复相同的操作,次数与文件中的行数相同。
从技术上讲,您不需要两者awk
或grep
两者之一,因为两者都可以进行文本匹配。如果您想要更具体的答案,请发布日志文件的摘录和您想要的输出示例。
答案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
。