我的文件如下:
19-04-05 08:45:22,643: INFO [ByrioThread] [] kks.connectorLog: Very important information
我想使用两个字符的定界符“:”将其剪切,但字段定义为“ field 2 and all next”。这将是一个cut命令,如下所示:
cut -f2- -d': '
所以输出将是:
INFO [ByrioThread] [] kks.connectorLog: Very important information
但是cut不支持多字符定界符。因此,在How to use cut with multiple character delimiter? unix中使用awk给出的答案不起作用。
任何帮助表示赞赏!
答案 0 :(得分:1)
您可以将'awk'与多字符定界符一起使用。
awk -F": " 'BEGIN {OFS=FS} {$1=""; print $0}' < input.txt | cut -c 3-
由于您需要在输出中显示定界符,因此需要设置输出字段分隔符(OFS),否则将用空格替换定界符。这是由BEGIN {OFS=FS}
完成的。然后,我们使用$1=""
删除第一个字段,然后打印掉剩余的内容,并删除了不必要的字段分隔符(使用cut
)
或者,我们可以删除第一个字段和字段分隔符,并直接执行以下操作:
awk -F": " 'BEGIN {OFS=FS} {sub($1 FS,"")}1' < input.txt
通过将空字符串替换为第一个字段和字段分隔符来完成删除。然后,附加的1
触发剩余文本的打印。
答案 1 :(得分:1)
第一部分19-04-05 08:45:22,643:
的大小总是固定的,为什么不这样做:
$ echo '19-04-05 08:45:22,643: INFO [ByrioThread] [] kks.connectorLog: Very important information' | sed -E 's/^.{23}//'
INFO [ByrioThread] [] kks.connectorLog: Very important information
或通过grep
grep -oP '(?<=\d{2}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}: ).*'
或通过awk
$ echo '19-04-05 08:45:22,643: INFO [ByrioThread] [] kks.connectorLog: Very important information' | awk -F '\([0-9]{2}[:-] ?\)*,[0-9]{3}: ' '{print $2}'
INFO [ByrioThread] [] kks.connectorLog: Very important information
答案 2 :(得分:1)
此grep
可能对您有用:
grep -Po ': \K.*' file
或使用parameter expansion的纯bash
解决方案:
while IFS= read -r line; do
printf '%s\n' "${line#*: }"
done < file