【问题标题】:bash: awk print with in printbash:awk 打印与打印
【发布时间】:2020-06-24 15:51:24
【问题描述】:

我需要 grep 一些模式,并且我需要在其中打印一些输出。目前我正在使用以下命令,它工作正常。但我喜欢消除使用多个管道并希望使用单个 awk 命令来实现相同的输出。有没有办法使用awk来做到这一点?

root@Server1 # cat file
Jenny:Mon,Tue,Wed:Morning
David:Thu,Fri,Sat:Evening

root@Server1 # awk '/Jenny/ {print $0}' file | awk -F ":" '{ print $2 }' | awk -F "," '{ print $1 }'

Mon

我想使用单个 awk 命令获得此输出。有什么帮助吗?

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:

    你可以试试这样的:

    awk -F: '/Jenny/ {split($2,a,","); print a[1]}' file 
    

    【讨论】:

      【解决方案2】:

      试试这个

      awk -F'[:,]+' '/Jenny/{print $2}' file.txt 
      
      • 它在[ ] 中使用了多个-F
      • + 表示一个或多个,因为它被视为正则表达式。

      【讨论】:

        【解决方案3】:

        对于这个特殊的工作,我发现grep 更强大一些。 除非您的公司有不雇用名叫 Eve 的人的政策。 (不明白的可以试试。)

        grep -oP '^[^:]*Jenny[^:]*:\K[^,:]+' file
        

        或者进行全词匹配:

        grep -oP '^[^:]*\bJenny\b[^:]*:\K[^,:]+' file
        

        或者当您确信“Jenny”是全名时:

        grep -oP '^Jenny:\K[^,:]+' file
        

        输出:

        Mon
        

        解释:

        • \K 之前的内容不言自明:它选择具有所需名称的行。
        • [^,:]+ 捕获星期几(在本例中为 Mon)。
        • \K 会切断 Mon 之前的所有内容。
        • -o 会切断 Mon 之后的任何内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-09
          • 1970-01-01
          • 2020-02-11
          • 2017-10-01
          • 2015-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多