我的输入文件包含来自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变量
帮助我。
答案 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