如何删除字符串输出的前两个单词

时间:2014-12-15 18:12:51

标签: linux bash awk sed cut

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

我有什么:

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

发送此文字:

00:00 down server

我想删除" 00:00"所以它只显示" server"。

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

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

请做好事情:

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各种主题

答案 1 :(得分:4)

使用-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循环能够使用globbing迭代文件。所以我会写类似

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

答案 2 :(得分:3)

您也可以使用sed:

sed 's/^.* * //'

答案 3 :(得分:0)

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

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

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

正则表达式,特别是Perl(以及所有PLRE衍生物,如Python和Ruby和Javascript中的那些),使用\s来匹配空格,使用\S来匹配非空格。因此\S+\s+的组合匹配一个单词后跟其空格。我们将该子表达式与(...)一起分组,然后告诉sed使用{m,n}表达式与行中的2个完全匹配,其中n是可选的,m是2.前导{{1} }表示修剪前导空格。