循环遍历sed的结果

问题描述 投票:3回答:2

我在循环存储在变量中的sed返回的行时遇到了麻烦。

目前它看起来有点像这样

lines=$(sed -rne '/'"$timestamplastupload"'/,/'"$timestampnow"'/ p' /var/log/test.log)

for line in "$lines"; do

        echo "This line is: $line"

done

但到目前为止,这不起作用,循环运行一次,而$ line变量的内容似乎是整个$ lines变量,因此只打印一次不通过逐行循环前缀“此行是:”

我错过了能够逐个循环遍历sed输出的每一行。 (最终可能会将匹配的一行逐行上传到API)所以我需要单独使用每一行,以便我可以根据需要处理它们。

根据要求,sed的一些输出已经被绑定以获得安全性

Wed Feb 28 22:33:11 2018 us=452112 xxx/1.2.3.4:55487 [xxx] Inactivity timeout (--ping-restart), restarting
Wed Feb 28 22:33:11 2018 us=452112 xxx/1.2.3.4:55487 [xxx] Inactivity timeout (--ping-restart), restarting
Wed Feb 28 22:33:11 2018 us=452112 xxx/1.2.3.4:55487 [xxx] Inactivity timeout (--ping-restart), restarting
Wed Feb 28 22:33:11 2018 us=452180 xxx/1.2.3.4:55487 SIGUSR1[soft,ping-restart] received, client-instance restarting
Wed Feb 28 22:33:11 2018 us=452180 xxx/1.2.3.4:55487 SIGUSR1[soft,ping-restart] received, client-instance restarting
Wed Feb 28 22:33:11 2018 us=452180 xxx/1.2.3.4:55487 SIGUSR1[soft,ping-restart] received, client-instance restarting
Wed Feb 28 22:33:11 2018 us=452180 xxx/1.2.3.4:55487 SIGUSR1[soft,ping-restart] received, client-instance restarting
bash sed
2个回答
1
投票

不要使用for阅读。改为使用流程替换:

while read -r line; do
  # your logic
done < <(sed -rne '/'"$timestamplastupload"'/,/'"$timestampnow"'/ p' /var/log/test.log)

看到:


0
投票

你的sed的输出是有用的(因为处理终结线),但除此之外,似乎this question提供了这些方面的答案:

IFS=' ' read -r -a array <<< "$lines"
for element in "${array[@]}"
do
    echo "$element"
done
© www.soinside.com 2019 - 2024. All rights reserved.