awk:按“\n”分割

Jay*_*enu 2 awk

我正在尝试处理一个日志文件,其中条目被压缩为一行,换行符编码为“\n”。我想将所有内容保留到第一个“\n”并丢弃其余部分。awk -F"\n" '{print $1}' file不起作用,也不起作用awk -F"\\n" '{print $1}' file。该命令的正确形式是什么?

Ed *_*ton 6

$ echo 'a\nb'
a\nb

$ echo 'a\nb' | awk -F'\\\\n' '{print $1}'
a
Run Code Online (Sandbox Code Playgroud)

原因如下:考虑在正则表达式比较中使用上述字符:

  • n = 字面字符n( $0 ~ /n/)
  • \n = 文字换行符 ( $0 ~ /\n/)
  • \\ = 用于正则表达式常量时的反斜杠 ( $0 ~ /\\/)
  • \\\\= 在动态正则表达式中使用时的反斜杠 ( $0 ~ "\\\\")

最后一个是因为动态正则表达式是一个字符串,必须解析一次才能转换为正则表达式,然后在用作该正则表达式时再次解析,因此由于它被解析两次,因此需要将所有转义加倍。

由于当您说将 FS 变量定义为动态正则表达式时,字段分隔符基本上是正则表达式(有一些变化)-F "whatever",因此转义必须加倍。