在具有mutlithreaded输出

时间:2018-03-21 16:50:46

标签: bash awk sed grep

我的输入文件包含来自API的多线程输出,如下所示:

i-12a: True^M 
i-4e6: False^M  
SSH error 1.1.1.1 i-678 i-9we: True^M
i-890: True^M
SSH error 1.1.1.2 i-001 i-007: False^M
SSH error None i-001 i-007: False^M
i-1ae: True^Mi-3644h: True^M

SSH错误将始终出现在新行中 我的目标是让所有出现的行都有SSH error,但它应该限于i- *并忽略该行包含None

e.g。对于上面的输入,输出应如下所示:

SSH error 1.1.1.1 i-678
SSH error 1.1.1.2 i-001

我正在尝试使用以下方式完成任务:

SSH_ERR="SSH error"
ssh_err=$(awk -v ERROR="$SSH_ERR" '$0~ERROR' <<< $(awk '$0 !~ /None/' < <file>))

但它提供如下输出:

i-123: True^M i-456: False^M  SSH error 1.1.1.1 i-678 i-987: True^M i-890: True^M SSH error 1.1.1.2 i-001 i-007: False^M SSH error None i-001 i-007: False^M

当你发帖回答时。您可以发布使用$SSH error代替SSH error的bash变量 帮助我。

4 个答案:

答案 0 :(得分:1)

您似乎在Input_file中控制了M个字符,因此我添加的解决方案也将删除它们,然后打印预期的输出。因此,关注awk可能对您有帮助。

awk '{gsub(/\r/,"")} /SSH error/{print $1,$2,$3}' Input_file

如果您希望在awk代码中拥有shell变量的值,然后搜索它,请使用以下内容:

SSH_ERR="SSH error"
awk -v ssh_error="$SSH_ERR" '{gsub(/\r/,"")} $0 ~ ssh_error{print $1,$2,$3}' Input_file

OR

SSH_ERR="SSH error"
awk -v ssh_error="$SSH_ERR" '{gsub(/\r/,"")} $0 ~ ssh_error && $0 !~ /NONE/{print $1,$2,$3}' Input_file

答案 1 :(得分:1)

简单 awk 命令:

awk '/^SSH error/ && !/None/{ print $1,$2,$3,$4 }' file

输出:

SSH error 1.1.1.1 i-678
SSH error 1.1.1.2 i-001

答案 2 :(得分:1)

你可以试试这个sed

sed '/^SSH error/!d;/None/d;s/[^ ]*//5g' infile

答案 3 :(得分:0)

awk '/1\.1\.1\../{print $1,$2,$3,$4}' file

输出

SSH error 1.1.1.1 i-678
SSH error 1.1.1.2 i-001