【问题标题】:Multicharacter delimiter cut多字符分隔符剪切
【发布时间】:2019-08-29 10:53:48
【问题描述】:

我的文件看起来像:

19-04-05 08:45:22,643: INFO  [ByrioThread] [] kks.connectorLog: Very important information

我想使用两个字符分隔符“:”将其剪切,但字段定义为“字段 2 和所有下一个”。这将是一个剪切命令:

cut -f2- -d': '

所以输出将是:

INFO  [ByrioThread] [] kks.connectorLog: Very important information

但是 cut 不支持多字符分隔符。因此这里给出的答案How to use cut with multiple character delimiter? unix with awk 不起作用。

任何帮助表示赞赏!

【问题讨论】:

  • 您对此的预期输出是什么?
  • “cut 不支持多字符分隔符” ...“因此回答 ... 用 awk 不起作用。” ..不计算。 awk 支持 正则表达式 作为字段分隔符,它当然支持多字符分隔符。 cut 支持的内容与 Awk 无关。
  • 如果您的数字是零填充的,那么您的信息很可能总是在同一列中开始。在这种情况下,不要尝试剪切字段分隔符,只需从特定列剪切:cut -c24-

标签: linux bash


【解决方案1】:

这个grep 可能对你有用:

grep -Po ': \K.*' file

或使用parameter expansion 的纯bash 解决方案:

while IFS= read -r line; do
   printf '%s\n' "${line#*: }"
done < file

【讨论】:

  • \K 总是超级方便! ;-) +1!
【解决方案2】:

您可以将“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 然后触发剩余文本的打印。

【讨论】:

    【解决方案3】:

    由于第一部分 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 2016-07-08
      • 2022-01-05
      • 2021-09-27
      相关资源
      最近更新 更多