我有这个嵌套的 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
谁能告诉我我的错误在哪里?
答案 0 :(得分:0)
您的代码未在文件中 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