【问题标题】:Shell script : How to cut part of a stringShell脚本:如何剪切字符串的一部分
【发布时间】:2011-04-14 03:01:37
【问题描述】:

我有以下字符串

â   â³ eGalax Inc. USB TouchController          id=9    [slave  pointer  (2)]
â   â³ eGalax Inc. USB TouchController          id=10   [slave  pointer  (2)]

并想获得 id 的列表?如何使用 sed 或其他东西来做到这一点?

【问题讨论】:

    标签: linux bash shell sed


    【解决方案1】:

    我将您的示例内容粘贴到名为 so.txt 的文件中。

    $ cat so.txt | awk '{ print $7 }' | cut -f2 -d"="
    9
    10
    

    解释:

    1. cat so.txt 会将文件内容打印到stdout
    2. awk '{ print $7 }' 将打印第七列,即包含 id=n 的那一列
    3. cut -f2 -d"=" 将使用= 作为分隔符剪切步骤#2 的输出并获得第二列(-f2

    如果你也想得到id=,那么:

    $ cat so.txt | awk '{ print $7 }' 
    id=9
    id=10
    

    【讨论】:

    • 这正是我想要的!
    • 无用的 cat 和 cut。 awk 可以做所有的事情。
    • @user229426:你的意思是不必要使用 cat 和 cut,而不是 useless,不是吗?
    • 这是将awk 与cut 结合使用的一个很好的解释。我试图将这个确切的东西用于另一个用例,并且在 awk 手册页和 awk 教程方面遇到了很多困难。非常感谢您花时间解释您的代码!
    【解决方案2】:

    使用正则表达式捕获 id 编号并将整行替换为该编号。应该这样做(匹配所有内容到“id =”,然后匹配任意数量的数字,然后匹配该行的其余部分):

    sed -e 's/.*id=\([0-9]\+\).*/\1/g'
    

    对每一行执行此操作,您将获得 id 列表。

    【讨论】:

    • 这个方法给出 9 和 1 但它应该是 9 和 10
    • 对,我在粘贴sed行时出错了。更新它以正常工作。
    【解决方案3】:

    perl 解决方案:

    perl -nE 'say $1 if /id=(\d+)/' filename
    

    【讨论】:

      【解决方案4】:

      您可以让awk 完成所有操作,而无需使用cut

      awk '{print substr($7,index($7,"=")+1)}' inputfile
      

      您可以使用split() 代替substr(index())

      【讨论】:

        【解决方案5】:
        $ ruby -ne 'puts $_.scan(/id=(\d+)/)' file
        9
        10
        

        【讨论】:

          【解决方案6】:

          假设输入

          {Anything}id={ID}{space}{Anything} 
          {Anything}id={ID}{space}{Anything}
          

          --

          #! /bin/sh
          while read s; do
             rhs=${s##*id=}
             id=${rhs%% *}
             echo $id # Do what you will with $id here
          done <so.txt 
          

          或者如果它总是第 7 个字段

          #! /bin/sh
          while read f1 f2 f3 f4 f5 f6 f7 rest
          do
          echo ${f7##id=}
          done <so.txt
          

          另见

          Shell Parameter Expansion

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-04-23
            • 2012-12-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-17
            相关资源
            最近更新 更多