【问题标题】:Bash: How to trim whitespace before using cutBash:如何在使用 cut 之前修剪空白
【发布时间】:2016-08-05 15:34:52
【问题描述】:

我有这样的命令的一行输出:

[]$ <command> | grep "Memory Limit"
Memory Limit:           12345 KB

我正在尝试拔出 12345。第一步 - 用冒号分隔 - 工作正常

[]$ <command> | grep "Memory Limit" | cut -d ':' -f2
           12345 KB

试图将其分开是很棘手的。如何修剪空白以使cut -d ' ' -f1 返回“12345”而不是空白?

【问题讨论】:

    标签: bash trim cut


    【解决方案1】:

    将您的命令传递给 awk,像这样打印第 3 列、一个空格和第 4 列

    <command> | awk '{print $3, $4}'
    

    这会导致:

    12345 KB
    

    <command> | awk '{print $3}'
    

    如果你想要裸号码。

    【讨论】:

    • 我建议用, 替换" ",因为awk 有一个默认的OFS,其值为单个空格。现有命令只是在其中包含一些无根据的东西并没有错。示例awk '{print $3" " $4}'awk '{print $3,$4}' 在默认OFS 的情况下会产生相同的输出。
    • @PS。你当然是对的。非常感谢您的提示。我对我的帖子进行了更改。
    【解决方案2】:

    tr 在这里提供帮助。

    $ echo "Memory Limit:           12345 KB" | tr -s " " | cut -d " " -f3
    12345
    
    • tr -s " " - 将所有空间压缩成一个
    • cut -d " " -f3 - 按空格分列并选择第三个

    【讨论】:

      【解决方案3】:

      您可以使用awk 并避免使用任何剪切、sed 或正则表达式:

      <command> | awk '/Memory Limit/{print $(NF-1)}'
      
      12345
      
      • /Memory Limit/ 将使此打印仅包含 Memory Limit 文本的一行
      • $(NF-1) 将在输入中为您提供last-1th 字段。

      【讨论】:

      • 大概&lt;command&gt; 输出的行数比包含“内存限制”的行数多。让awk 选择想要的行而不是使用单独的grep 并不难,但你需要做一个或另一个。
      • 在这种情况下是的:&lt;command&gt; | awk '/Memory/{print $(NF-1)}' 应该可以工作
      【解决方案4】:

      你必须使用cut吗? cut 仅用于单字符分隔符提取。我不认为切割可以像你想象的那么容易。

      sed 很简单:

      $ echo "Memory Limit:           12345 KB" | sed 's/.*:\s*//'
      12345 KB
      

      解释:

      .*:\s* 匹配最后一个冒号之前的所有字母,然后匹配之后的所有空字符,并通过替换为空字符串来删除它们。


      事实证明,您期望的是一个数字。那么我会说继续匹配数字:

      $ echo "Memory Limit:           12345 KB" | grep -o -P '\d+'
      12345
      

      【讨论】:

        【解决方案5】:

        bash 也有您可以使用的正则表达式匹配。

        result=$(<command> | grep "Memory Limit")
        regex='Memory Limit:[[:space:]]+([[:digit:]]+)[[:space:]]KB'
        if [[ $result =~ $regex ]]; then
          result=${BASH_REMATCH[0]}
        else
          # deal with an unexpected result here
        fi
        

        $regex的值可以根据需要调整。

        【讨论】:

          【解决方案6】:

          awk 可能是完成这项任务的最佳选择,但这是一种非正统的方式

          $ grep -oP "(?<=Memory Limit:)\s+[0-9]+" file | xargs
          

          lookbehind 匹配标签和输出只匹配,使用 xargs 吃掉空格

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-09
            • 2014-03-06
            • 2010-11-14
            • 2011-01-16
            • 2011-04-23
            • 1970-01-01
            • 1970-01-01
            • 2012-11-23
            相关资源
            最近更新 更多