嵌套的 bash 循环运行但逻辑不正确

时间:2021-03-31 19:42:22

标签: linux bash for-loop nested-loops

我有这个嵌套的 bash for 循环,其中第一个循环代表服务器范围,第二个循环读取 .txt 文件的每一行。然后将执行 zgrep -i 并在匹配行上查找字符串。

keys.txt 如下:

1121313232323-1
1121313244234-1
1121867575757-1

Bash 循环:

for i in {1..80}; do for j in `cat keys.txt`; do zgrep -i 'InitialRequest' /var/logs/server$i/* >> /var/log/result.log; done; done & 

这会运行,但它会记录定义了“InitialRequest”的每个实例。我正在寻找的是仅记录关键行与“InitialRequest”及其关键值匹配的行。

我期望的结果是这样的(来自 J 内循环的 Key 值 1121313232323-1 和字符串 'InitialRequest' 加上该行的其余部分:

1121313232323-1 InitialRequest http://someramdomurl.com

我得到的是(只是匹配的字符串,没有来自 J 内部循环的 Key 值:

InitialRequest http://someramdomurl.com
InitialRequest http://someotherramdomurl.com
InitialRequest http://someotherotherramdomurl.com

谁能告诉我我的错误在哪里?

1 个答案:

答案 0 :(得分:0)

您的代码未在文件中 zgreping $j。为更清楚起见,我将在我的回答中将 $i 替换为 $server 并将 $j 替换为 $key。看看:

for server in server{1..80}; do
    for key in $(cat keys.txt); do
        zgrep -i "$key InitialRequest" /var/logs/$server/* >>/var/log/result.log
    done
done

但由于您总是使用相同的密钥,因此您只需要阅读一次即可。这是一个更好的版本:

keys=($(cat keys.txt))

for server in server{1..80}; do
    for key in ${keys[*]}; do
        zgrep -i "$key InitialRequest" /var/logs/$server/* >>/var/log/result.log
    done
done