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

Nested bash loop runs but logic is not correct

我有这个嵌套的 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 内部循环 1121313232323-1 中的键值和字符串 'InitialRequest' 加上行的剩余部分:

1121313232323-1 InitialRequest http://someramdomurl.com

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

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

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

您的代码未 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