AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 670284
Accepted
Rahul Bharadwaj
Rahul Bharadwaj
Asked: 2021-09-24 03:17:04 +0800 CST2021-09-24 03:17:04 +0800 CST 2021-09-24 03:17:04 +0800 CST

awk 无法处理 sed 的管道输出

  • 772

我有一个大致如下所示的日志文件:

Sep 23 10:28:26 node kernel: em0: device is going DOWN
Sep 23 10:28:26 node kernel: em0: device is going UP
Sep 23 10:29:14 node cdsmon: /tmp/instance0 ; core dumped
Sep 23 10:29:14 node cdsmon: /tmp/instance0 ; core dumped
Sep 23 10:28:26 node kernel: em0: device is going DOWN
Sep 23 10:29:14 node cdsmon: /tmp/instance1 ; core dumped
Sep 23 10:28:26 node kernel: em0: device is going UP
Sep 23 10:29:14 node cdsmon: /tmp/instance2 ; core dumped

我想用 检测线条,cdsmon然后将线条分割;(以获取/tmp/instance0和 之类的事件core dumped)。

为此,我用作sed:

sed -u -n -e "s/^.*cdsmon: //p" /tmp/dev.log

输出为:

/tmp/instance0 ; core dumped
/tmp/instance0 ; core dumped
/tmp/instance1 ; core dumped
/tmp/instance2 ; core dumped

但是在将这个输出传送到awk如下所示时,它会给出与上面相同的输出:

sed -u -n -e "s/^.*cdsmon: //p" /tmp/dev.log | awk -F ";" "{print $1}"

尽管-u从sed.

谁能指出我是否遗漏了什么?我正在使用带有常规 awk/sed 的 FreeBSD 机器,不幸的是无法安装任何新软件包。

awk sed
  • 4 4 个回答
  • 1746 Views

4 个回答

  • Voted
  1. Best Answer
    AdminBee
    2021-09-24T03:23:00+08:002021-09-24T03:23:00+08:00

    的行为的原因awk是您已将程序括在双引号中,这使字符串对 shell 的变量扩展开放。这意味着您运行程序的 shell 将首先展开$1,并且由于这可能是未定义的,它会展开为空字符串。

    所以,你的程序相当于

    awk -F ";" "{print}"
    

    这就是打印整行的原因。这是您应该始终将awk(and sed) 程序包含在单引号中的原因之一。

    请注意,在大多数情况下,您不需要将输出从管道输入,sed反之亦然awk。在您的示例中,如果您想获取“事件标签”之后的第一个字段,您可以执行以下操作:

    sed -E -n 's/^.*cdsmon: ([^;]*).*$/\1/p' /tmp/dev.log 
    

    这将围绕字符串定义一个捕获组cdsmon:,直到 first ;,并将整行替换为该捕获组的内容。

    如果要打印由 记录的事件的摘要cdsmon,可以将上述sed方法扩展为:

    sed -E -n 's/^.*cdsmon: ([^;]*) ; (.*)$/\1 : \2/p' dev.log 
    

    或者,这是另一种awk-only 方法:

    awk -F'(cdsmon: | ; )' 'NF==3{printf "%s : %s\n",$2,$3}' dev.log 
    

    对于您的示例,两者都将打印

    /tmp/instance0 : core dumped
    /tmp/instance0 : core dumped
    /tmp/instance1 : core dumped
    /tmp/instance2 : core dumped
    

    但请注意,该awk方法可能会遇到极端情况。它采用模式cdsmon: 和;作为字段分隔符。当有三个字段时(在您的示例中,它只能发生在cdsmon:条目中),它会打印第二个和第三个字段,对应于实例名称之后cdsmon:和原因之后;。

    • 19
  2. schrodingerscatcuriosity
    2021-09-24T03:28:18+08:002021-09-24T03:28:18+08:00

    根据手册:

    双引号保护开引号和闭引号之间的大部分内容。shell 至少对引用的文本进行变量和命令替换。不同的 shell 可能会对双引号文本进行其他类型的处理。

    由于双引号文本中的某些字符由 shell 处理,因此它们必须在文本中进行转义。值得注意的是字符 '$'、'`'、'\' 和 '"',如果要按字面意思传递给程序,则在双引号文本中必须以反斜杠开头。

    因此,在您的情况下,您可以转义美元符号$:

    sed -u -n -e "s/^.*cdsmon: //p" /tmp/dev.log | awk -F ";" "{print \$1}"
    

    但是使用单引号更容易:

    sed -u -n -e "s/^.*cdsmon: //p" /tmp/dev.log | awk -F ' ; ' '{ print $1 }'
    

    您也可以在分隔符之间留出空格,' ; '这样您就不会在每行之后以不可见的空格结尾。

    您也可以只使用awk:

    $ awk -F': | ; ' '/cdsmon/ { print $2 }' /tmp/dev.log
    /tmp/instance0
    /tmp/instance0
    /tmp/instance1
    /tmp/instance2
    
    • 8
  3. roaima
    2021-09-24T03:32:09+08:002021-09-24T03:32:09+08:00

    我会使用awk整个操作。在这里,我在冒号上进行拆分,因此在考虑了日期/时间之后,必须将主机匹配应用于第三个字段(14 node cdsmon例如):

    awk -F: '
        $3 ~ / cdsmon$/ {
            split($4, text, / *; */);    # Split field at semicolon
            sub(/^ */, "", text[1]);     # Remove leading space
            printf "instance %s, reason %s\n", text[1], text[2]
        }
    ' /tmp/dev.log
    

    这是评论中建议的替代且更简单的解决方案,我们在冒号或分号上拆分,因此必要的字段已经直接在awk变量中:

    awk -F': | *; *' '
        $1 ~ / cdsmon$/ { printf "instance %s, reason %s\n", $2, $3 }
    ' /tmp/dev.log
    

    你没有说你想如何提取实例和原因(或者如果你做了,我错过了),所以我只是将它们打印在一个字符串中,证明它们已被正确提取。

    • 8
  4. Praveen Kumar BS
    2021-09-24T11:05:22+08:002021-09-24T11:05:22+08:00
    awk '{for(i=1;i<=NF;i++){if($i ~ /cdsmon/){print $(i+1),$(i+3),$(i+4)}}}' filename
    

    输出

    /tmp/instance0 core dumped
    /tmp/instance0 core dumped
    /tmp/instance1 core dumped
    /tmp/instance2 core dumped
    
    
    
    
    
    awk '{for(i=1;i<=NF;i++){if($i ~ /cdsmon/){print $(i+1)}}}' filename
    /tmp/instance0
    /tmp/instance0
    /tmp/instance1
    /tmp/instance2
    
    • 1

相关问题

  • 如何改进这个字符转换脚本?

  • 如何删除两行之间的单行

  • 重新排列字母并比较两个单词

  • 多行文件洗牌

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve