【问题标题】:Cut a field and cut again in the result using AWK使用 AWK 剪切一个字段并在结果中再次剪切
【发布时间】:2021-02-21 16:52:17
【问题描述】:

作为使用 AWK 的一部分,我试图仅在输出中获取 MariaDB 版本号。

# mysql -V
mysql  Ver 15.1 Distrib 10.1.48-MariaDB, for Linux (x86_64) using readline 5.1

# mysql -V | awk -F"-" '{print $1}' | awk '{print $5}'
10.1.48

在 AWK 中是否有解决方法来缩短它,比如避免在第三个管道中再次使用 awk '{print $5}' 并将所有内容都放在单个 awk 中?。

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    您可以将[ -]+ 用作FS,表示1+ 空格或连字符:

    mysql -V | awk -F '[- ]+' '{print $5}'
    
    10.1.48
    

    【讨论】:

    【解决方案2】:

    我会将 '-' 替换为 ' 'gsub() 导致这一行:

    mysql  Ver 15.1 Distrib 10.1.48 MariaDB, for Linux (x86_64) using readline 5.1
      $1   $2   $3   $4      $5     $6 ....
    

    并打印字段编号 5:

    # mysql -V | awk '{gsub("-"," "); print $5}'
    10.1.48
    

    【讨论】:

      【解决方案3】:

      如果您使用正则表达式且没有硬编码字段编号,请尝试以下操作。这应该能够捕获甚至版本是10.1.48.1.2(如果在任何情况下它在那里)

      echo "10.1.48" | 
      awk 'match($0,/([0-9]+\.){1,}[0-9]+/){print substr($0,RSTART,RLENGTH)}'
      

      【讨论】:

        【解决方案4】:

        您的问题的直接答案是 Awk 让您再次split 一个字段。

        # mysql -V | awk -F"-" '{split($1, n, /[ \t]+/); print n[5] }'
        

        【讨论】:

          【解决方案5】:

          您可以通过sed获取它:

          $ echo 'mysql  Ver 15.1 Distrib 10.1.48-MariaDB, for Linux (x86_64) using readline 5.1' |
          sed -nE 's/.* ([0-9][0-9.]*)-MariaDB.*/\1/p'
          

          或者使用 GNU grep:

          $ echo 'mysql  Ver 15.1 Distrib 10.1.48-MariaDB, for Linux (x86_64) using readline 5.1' |
          ggrep -oP '[0-9][0-9.]*(?=-MariaDB)'
          

          任一打印:

          10.1.48
          

          【讨论】:

            【解决方案6】:

            考虑使用split 来避免额外的 awk 实例:

            # msql -V | awk -F"-" '{ split($1, a, " ") ; print a[4] }'
            

            【讨论】:

              【解决方案7】:

              这是我能附带的最短的awk 脚本:

              msql -V | awk '{sub("-MariaDB,","");print $5}'
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-09-14
                • 1970-01-01
                • 2016-04-07
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多