【问题标题】:grep 2 elements in a line and print themgrep 一行中的 2 个元素并打印它们
【发布时间】:2017-08-17 13:38:34
【问题描述】:

这是我的问题,我有一个包含条目的文件,我想只获取日期+最后一个“]之后的最后一个命令:”

Aug 17 14:25:17 snaper[22134]: [ip:10.1.15.245 37985 10.1.15.18 22 uid:10000 sid:21680 tty: cwd:/data/www/hybris/hybris/bin/platform filename:/bin/ps]: /bin/ps -p 6763

cat 文件时如何获取它?

我可以得到日期:

awk '{print $1,$2,$3}'

最后一个命令是:

awk -F': ' '{print $NF}'

但是如何将它们组合成一行呢? 我不受 awk 限制,任何 sed grep 或其他命令对我来说都可以:) 提前致谢

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    只需删除日期和最后一个命令之间的所有内容:

    sed 's/^\(... .. ..:..:..\).*: /\1 /'
    

    【讨论】:

    • 它看起来像盲文转录。
    【解决方案2】:

    使用 AWK 的简单解决方案

    $awk '{print $1,$2,$3,  $(NF-2), $(NF-1), $NF }' file
    Aug 17 14:25:17 /bin/ps -p 6763
    

    【讨论】:

      【解决方案3】:

      使用 GNU grep

      grep -oP '^.{15}|.*\]: \K.*' file | paste - -
      

      【讨论】:

        【解决方案4】:

        可能使用 tee 将 1 个输出用于 2 个命令:

        echo 'Aug 17 14:25:17 snaper[22134]: [ip:10.1.15.245 37985 10.1.15.18 22 uid:10000 sid:21680 tty: cwd:/data/www/hybris/hybris/bin/platform filename:/bin/ps]: /bin/ps -p 6763' | tee >(awk -F': ' '{print $NF}') | awk '{print $1,$2,$3}' | tr '\n' ' '
        

        我们的输出为:

        Aug 17 14:25:17 /bin/ps -p 6763 
        

        【讨论】:

          【解决方案5】:
          $ s="Aug 17 14:25:17 snaper[22134]: [ip:10.1.15.245 37985 10.1.15.18 22 uid:10000 sid:21680 tty: cwd:/data/www/hybris/hybris/bin/platform filename:/bin/ps]: /bin/ps -p 6763"    
          

          使用sed 实现您的目标,

          $ sed -r 's/(^.*:[0-9]{2}) .*]:/\1/' <<< "$s"
          

          【讨论】:

            【解决方案6】:

            也尝试以下解决方案。考虑到您的 Input_file 将具有与所示示例相同的数据。

            解决方案一:使用简单的剪切命令。

            cut -d" " -f1,2,3,14,15,16  Input_file
            

            解决方案 2: 在我制作字符串 snaper 的地方使用 awk 命令和 ]: 作为字段分隔符。

            awk -F' snaper|]:' '{print $1,$4}'  Input_file
            

            解决方案 3: 将记录分隔符设为空格,然后根据 OP 的要求仅打印我们需要的那些行。

            awk -v RS=" " 'NR<4||NR>13{printf("%s%s",$0,NR<3||NR<16?" ":"")}' Input_file
            

            解决方案 4: 将所有内容从 snap 替换为 till : 并获得 OP 的要求。

            awk '{sub(/snaper\[.*\]: /,"");print}'  Input_file
            

            解决方案 5: 在此处使用 --re-interval(因为我有旧版本的 awk)如果您的系统中也有最新的 awk 版本,则可以将其删除。

            awk --re-interval '{match($0,/.*[0-9]{2}:[0-9]{2}:[0-9]{2}/);print substr($0,RSTART,RLENGTH),$(NF-2),$(NF-1),$NF}'  Input_file
            

            解决方案 6: 使用 sed 并将所有内容替换为 snaper,然后将所有内容替换为冒号并仅打印匹配项。

            sed 's/\(.[^s]*\)\(.*:\)\(.*\)/\1\3/'   Input_file
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-06-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-02
              • 1970-01-01
              相关资源
              最近更新 更多