只打印第一次匹配

rye*_*ayo 6 bash scripts

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

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

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

(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)
Run Code Online (Sandbox Code Playgroud)

有什么办法可以修剪这个,所以我只能显示第一组数据一次。我只需要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;
Run Code Online (Sandbox Code Playgroud)

然后尝试了这个:

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

Avi*_*Raj 9

尝试这个,

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

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

或者

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

for .... | awk -F'[(/]' '{print $2;exit}'
Run Code Online (Sandbox Code Playgroud)