多字符定界符剪切

时间:2019-04-08 10:05:23

标签: linux bash

我的文件如下:

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给出的答案不起作用。

任何帮助表示赞赏!

3 个答案:

答案 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