【问题标题】:how to remove first two words of a strings output如何删除字符串输出的前两个单词
【发布时间】:2015-02-13 22:09:01
【问题描述】:

我想删除输出字符串中出现的前两个单词。这个字符串也在另一个字符串中。

我有什么:

for servers in `ls /data/field`    
do    
  string=`cat /data/field/$servers/time`

这会发送这个文本:

00:00 down server

我想删除“00:00 down”以便它只显示“服务器”。

我尝试过使用cut -d ' ' -f2- $string,它最终只会删除命令搜索的目录。

有什么想法吗?

【问题讨论】:

    标签: linux bash awk sed cut


    【解决方案1】:

    对于给出的示例,我更喜欢 cut。但是对于问题所表达的一般问题,上面的答案都有一些小缺点。例如,当您不知道单词之间有多少个空格 (cut),或者它们是否以空格开头 (cut,sed),或者不能在管道中轻松使用时 (shell for-loop)。这是一个快速、高效且不难记住的 perl 示例:

     | perl -pe 's/^\s*(\S+\s+){2}//'
    

    Perl 的-p 像sed 一样运行。也就是说,它一次输入一行,例如-n,然后在dong工作后再次打印该行。 -e 启动基于命令行的脚本。该脚本只是一个替换s/// 表达式的一行;将左侧的匹配正则表达式替换为右侧的字符串。在这种情况下,右侧是空的,所以我们只是删除了左侧的表达式。

    正则表达式,特别适用于 Perl(以及所有 PLRE 派生词,如 Python、Ruby 和 Javascript 中的那些),使用 \s 匹配空格,使用 \S 匹配非空格。所以\S+\s+ 的组合匹配一个单词,后面跟着它的空格。我们将该子表达式与(...) 组合在一起,然后告诉sed 与{m,n} 表达式精确匹配一行中的2 个,其中n 是可选的,m 是2。前导\s* 表示修剪前导空格。

    【讨论】:

      【解决方案2】:

      拜托,好好做事:

      for servers in /data/field/*; do
          string=$(cut -d" "  -f3- /data/field/$servers/time)
          echo "$string"
      done
      
      • 反引号在 2014 年被弃用,取而代之的是 $( )
      • 不要解析ls 输出,使用glob 而不是像我对data/field/* 所做的那样

      查看http://mywiki.wooledge.org/BashFAQ 了解各种主题

      【讨论】:

      • 我必须承认,我也有同样的坏习惯,所以我开始寻找在这种情况下不应该使用 ls 的原因。所以感谢那个链接+1。无论如何,FAQ 相当大,所以为了节省其他人一些时间,为什么你不应该使用 ls,请参阅:mywiki.wooledge.org/ParsingLs
      【解决方案3】:

      使用-d 选项将分隔符设置为空格

      $ echo 00:00 down server | cut -d" "  -f3-
      server
      

      注意使用字段号3作为计数从1开始,而不是0

      来自手册页

        -d, --delimiter=DELIM
                    use DELIM instead of TAB for field delimiter
      
         N-     from N'th byte, character or field, to end of line
      

      更多测试

      $ echo 00:00 down server hello world| cut -d" "  -f3-
      server hello world
      

      for 循环能够使用通配符遍历文件。所以我会写一些类似的东西

      for servers in /data/field*
      do    
        string=`cut -d" "  -f3- /data/field/$servers/time`
      ...
      ...
      

      【讨论】:

      • 只要单词用一个空格分隔就可以了。
      【解决方案4】:

      您也可以使用 sed:

      sed 's/^.* * //'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多