【问题标题】:Get the last 4 characters of output from standard out从标准输出中获取输出的最后 4 个字符
【发布时间】:2012-02-09 22:35:44
【问题描述】:

我有一个正在运行并使用的脚本

lspci -s 0a.00.1 

这会返回

0a.00.1 usb controller some text device 4dc9

我想将最后 4 个字符内联,这样

lspci -s 0a.00.1 | some command to give me the last 4 characters. 

【问题讨论】:

    标签: linux bash shell character


    【解决方案1】:

    tail 怎么样,带有-c 开关。例如,要获取“hello”的最后 4 个字符:

    echo "hello" | tail -c 5
    ello
    

    请注意,我使用了 5 (4+1),因为echo 添加了换行符。正如下面 Brad Koch 所建议的,使用 echo -n 来防止添加换行符。

    【讨论】:

    • echo -n 会阻止添加换行字节。
    • 在我的 bash 中,“-c”和“5”之间不能有空格。它必须是“tail -c5”,而不是“tail -c 5”。
    【解决方案2】:

    你真的想要最后四个字符吗?看起来你想要最后一个“单词”:

    awk '{ print $NF }'
    

    如果 ID 为 3 个字符或 5 个字符,这将起作用。

    【讨论】:

      【解决方案3】:

      使用sed

      lspci -s 0a.00.1 | sed 's/^.*\(.\{4\}\)$/\1/'
      

      输出:

      4dc9
      

      【讨论】:

      • 您可以通过以下方式改进:sed -n '$s/.*\(....\)$/\1/p';这只会打印输出的最后一行,并且 4 个点比用 .\{4\} 表示法描述它的 6 个字符更简单。
      【解决方案4】:

      试试这个,假设字符串存储在变量 foo 中。

      foo=`lspci -s 0a.00.1` # the foo value should be "0a.00.1 usb controller some text device 4dc9"
      echo ${foo:(-4)}  # which should output 4dc9
      

      【讨论】:

        【解决方案5】:

        我经常用

        echo 0a.00.1 usb controller some text device 4dc9 | rev | cut -b1-4 | rev
        4dc9
        

        【讨论】:

        • 虽然可行,但这项工作似乎涉及很多过程。
        • @JonathanLeffler:但是非常快。我经常发现rev|cut|rev 是所有可能的解决方案中最快的。
        【解决方案6】:

        如果真正的请求是复制最后一个以空格分隔的字符串而不管其长度如何,那么最好的解决方案似乎是使用@Johnsyweb 给出的... | awk '{print $NF}'。但如果这确实是从字符串末尾复制固定数量的字符,那么有一个特定于 bash 的解决方案,无需通过管道调用任何进一步的子进程:

        $ test="1234567890"; echo "${test: -4}"
        7890
        $
        

        请注意冒号和减号之间的空格是必不可少的,因为没有它,整个字符串将被传递:

        $ test="1234567890"; echo "${test:-4}"
        1234567890
        $
        

        【讨论】:

        • 抱歉,我刚刚注意到这个解决方案实际上与史明江的建议相同,只是省略了偏移量周围的括号。
        • 您可以根据需要删除此答案。
        【解决方案7】:

        尝试使用grep

        lspci -s 0a.00.1 | grep -o ....$
        

        这将打印每行的最后 4 个字符。

        但是,如果您想要整个输出的最后 4 个字符,请改用 tail -c4

        【讨论】:

          【解决方案8】:

          解决此问题的另一种方法是使用<<< 表示法:

          tail -c 5 <<< '0a.00.1 usb controller some text device 4dc9'
          

          【讨论】:

          • 这仅在源内容以变量或固定字符串形式出现时有效。在这种情况下,它确实避免了不必要的管道,包括两个进程而不是一个进程,方法是将变量或固定字符串直接写入尾部的标准输入。但是,OP 希望从命令的输出中获取最后四个字符,使用您的构造必须是
          • (..) 必须是 "tail -c 5
          【解决方案9】:

          不要使用命名变量,而是养成使用位置参数的做法,如下所示:

          set -- $( lspci -s 0a.00.1 );   # then the bash string usage:
          echo ${1:(-4)}                  # has the advantage of allowing N PP's to be set, eg:
          
          set -- $(ls *.txt)
          echo $4                         # prints the 4th txt file.  
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-23
            • 2020-05-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多