grep 查找分隔符中模式之后的内容

grep 查找分隔符中模式之后的内容

说我有一个文件

#cat file.log
abc|123|text1 modesc=bpp123 raw_info=clear
abc|123|text2 modesc=pmk123 severity=minor
abc|123|text3 modesc=pnj123 info=good

只想知道 print $3 中的哪些单词出现在“modesc=”之后直到空格,

我更希望该命令的输出如下所示:

abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

使用 bash,我想打印出 $3 刚刚得到“modesc=”之后的单词。有没有办法做到这一点?

答案1

$ sed 's/[^|]*modesc=\([^ ]*\).*$/\1/' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

这用于将整个最后一个字段替换为下一个空格sed之后的内容。modesc=


$ awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3)} 1' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123

awk程序通过两次替换修改第三列。第一个删除所有直到(包括)的内容modesc=,第二个删除第一个剩余空间之后的所有内容。1末尾的单独的将导致awk打印修改的记录(这可以被替换{ print })。


仅有的从原始数据的第三列(而不是其他任何内容)获取后面的字符串modesc=,您可以使用上述命令之一,然后通过管道将其传输cut -d '|' -f3,或者您可以使用

sed 's/.*modesc=\([^ ]*\).*$/\1/' file

或者

awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(" .*", "", $3); print $3 }' file

答案2

awk可以使用多个分隔符并使其非常简单:

awk -F'[|= ]' ' {print $1"|" $2"|" $5}' /tmp/file.log

在上面的管道中|,等价符号=和空格 是分隔符。

您可以像这样显式定义输出分隔符:

awk -F'[|= ]' 'BEGIN { OFS="|"}  {print $1,$2,$5}' /tmp/file.log

答案3

使用awk

awk -F\| '{print $1"|"$2"|"gensub(/modesc=(.*) .*$/,"\\1","g",$3)}' /tmp/file.log

答案4

这会降低效率,但该任务非常适合cut并且paste

paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')

相关内容