【问题标题】:Echo variable on each iteration of while loop在while循环的每次迭代中回显变量
【发布时间】:2021-11-03 10:45:36
【问题描述】:

我正在尝试回显警报文件(命名为关键)的每一行的信息/变量,使用while read line 获取警报文件的每一行(关键文件上可能有很多行):

while read line
do
{
s=`grep -Po '(?<=(sender:)).*' critical| cut -d ',' -f1` 
t=`grep -Po '(?<=(time:)).*' critical| cut -d '.' -f1` 
d=`grep -Po '(?<=(.1.3.6.1.4.1.2285.1.1.8:)).*' critical| cut -d ',' -f1` 
echo "Sender: $s" >>critical_body
echo "Time: $t" >>critical_body
echo "Description: $d" >>critical_body
}
done < critical

我需要的输出结构如下:

Sender:  xyz1
Time:  2021/08/11 22:14:19
Description: Lost communication with device

Sender: xyz2
Time: 2021/08/13 15:58:02
Description: Memory usage is above normal: 10% free

但我得到以下信息,似乎变量值在一次迭代中全部打印出来,并用/n 分隔,而不是我想要的一个一个。

Sender:  xyz1
 xyz2
Time:  2021/08/11 22:14:19
 2021/08/13 15:58:02
Description: Lost communication with device
Memory usage is above normal: 10% free
Sender:  xyz1
 xyz2
Time:  2021/08/11 22:14:19
 2021/08/13 15:58:02
Description: Lost communication with device
Memory usage is above normal: 10% free

有人可以帮助我吗?我试图找出问题所在,我在 bash 脚本方面相对较新。

cat critical
2021-08-11 22:14:19,550 INFO  [com.optimization.ems.snmp.FnTrapReceiver] raw trap record inserted: com.optimization.ems.ems.model.snmp.RawTrapid: null, oid: .1.3.6.1.4.1.2285.1.2.14, time: 2021/08/11 22:14:19.547, sender: xyz1, version: 2, varbind: .1.3.6.1.2.1.1.3.0:5d 11h 0m 35s 350ms,.1.3.6.1.6.3.1.1.4.1.0:.1.3.6.1.4.1.2285.1.2.14,.1.3.6.1.4.1.2285.1.1.6:xyz1,.1.3.6.1.4.1.2285.1.1.8:Lost communication with device,.1.3.6.1.4.1.2285.1.1.3:5,
2021-08-13 15:58:02,083 INFO  [com.optimization.ems.snmp.FnTrapReceiver] raw trap record inserted: com.optimization.ems.ems.model.snmp.RawTrapid: null, oid: .1.3.6.1.4.1.2285.1.2.3, time: 2021/08/13 15:58:02.79, sender: xyz2, version: 2, varbind: .1.3.6.1.2.1.1.3.0:98d 21h 39m 6s 60ms,.1.3.6.1.6.3.1.1.4.1.0:.1.3.6.1.4.1.2285.1.2.3,.1.3.6.1.4.1.2285.1.1.2:15:58:02 13/08/2021,.1.3.6.1.4.1.2285.1.1.3:5,.1.3.6.1.4.1.2285.1.1.8:Memory usage is above normal: 10% free,

【问题讨论】:

  • 我建议你使用 sed 来提取令牌。
  • 请贴一个“关键文件”的例子
  • 我发布了关键文件示例。
  • 您正在为每一行处理整个critical 并忽略$line 变量
  • @jhnc 如何在循环中使用 $line 变量?

标签: bash while-loop echo


【解决方案1】:

对于您使用 grep 的每一行,您可以通过管道连接到 echo 命令以一次性输出所有内容。之后你可以grep时间,然后是描述。在描述之后,您可以在开始循环的新迭代之前单独使用echo 来创建一个新行。

为了更方便的调试和故障排除,测试sender sender的grep,看看命令行的输出是否正确,然后你可以将这个添加到脚本中,当sender的输出正确时,其他两个应该之后更容易修改。

s=`grep -Po '(?<=(sender:)).*' critical| cut -d ',' -f1` | echo "Sender: $s" >>critical_body

【讨论】:

  • 你好。我试过这个,但它不是一次性打印变量的值,它只打印 Sender: 。我正在检查
【解决方案2】:

你可以试试这个脚本。这有点小技巧,可能有更有效的方法来实现这一点。

 for c in critical;           
    do      
    out="critical.outfile"; 
    outNew="crit.out "    ;     
    sed -E 's/.*(sender[^,]*).*/\1/1' "$c" > "$out";           
    sed -E 's/.*(time[^,]*).*/\1/' "$c" >> "$out";          
    sed -E 's/.*[0-9]:([^0-9].*[a-z]),.*/Description: \1/' "$c" >> "$out";
    awk '!r[$1]++' "$out" > $outNew;      
    echo >> $outNew;     
    awk 'r[$1]++' "$out" >> $outNew;
    cat $outNew  
done

输出

sender: xyz1
time: 2021/08/11 22:14:19.547
Description: Lost communication with device

sender: xyz2
time: 2021/08/13 15:58:02.79
Description: Memory usage is above normal: 10% free

【讨论】:

  • :) 更好,但它给了我:sender: xyz1 sender: xyz2 time: 2021/08/11 22:14:19.547 time: 2021/08/13 15:58:02.79 Description: Lost communication with device Description: Memory usage is above normal: 10% free
  • 非常适合我。你所拥有的是$out 变量文件的输出。我将编辑我的答案,以便有一个带有输出的文件
  • 它仅在有 2 行时才有效,但对于更多行,它再次给出相同的 sender: xyz sender: xyz sender: xyz time: 2021/08/13 15:58:02.79 time: 2021/08/13 15:14:19.572 time: 2021/08/13 15:34:19.549 Description: Memory usage is above normal: 10% free Description: Lost communication with device Description: Lost communication with device :(
  • 如前所述,根据提供的示例,它有点像 hack。由于awk,它将在 2+ 行失败
【解决方案3】:

类似这样的:

while read line; do
    time=${line/*time:/}
    time=${time/.*, sender:*/}
    sender=${line/*sender: /}
    sender=${sender/, version:*/}
    description=${line/*.1.1.8:/}
    description=${description/,*/}
    printf 'Sender: %s\nTime: %s\nDescription: %s\n\n' "$sender" "$time" "$description"
done < critical

输出将是:

Sender: xyz1
Time:  2021/08/11 22:14:19
Description: Lost communication with device

Sender: xyz2
Time:  2021/08/13 15:58:02
Description: Memory u sage is above normal: 10% free

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 2021-05-30
    • 2021-12-08
    • 1970-01-01
    • 2014-12-12
    • 2016-11-08
    • 2018-09-01
    • 2018-05-23
    • 2016-07-29
    相关资源
    最近更新 更多