嵌套 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
谁能告诉我我的错误在哪里?
您的代码未 zgrep
ing $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
我有这个嵌套的 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
谁能告诉我我的错误在哪里?
您的代码未 zgrep
ing $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