Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何删除字符串输出的前两个字_Linux_Bash_Awk_Sed_Cut - Fatal编程技术网

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

Linux 如何删除字符串输出的前两个字,linux,bash,awk,sed,cut,Linux,Bash,Awk,Sed,Cut,我想删除输出字符串中出现的前两个单词。此字符串也在另一个字符串中 我所拥有的: for servers in `ls /data/field` do string=`cat /data/field/$servers/time` 这将发送以下文本: 00:00 down server 我想删除“00:00 down”,这样它只显示“server” 我尝试过使用cut-d'-f2-$string,结果只是删除了命令搜索的目录 有什么想法吗?使用-d选项将delimtier设置

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

我所拥有的:

for servers in `ls /data/field`    
do    
  string=`cat /data/field/$servers/time`
这将发送以下文本:

00:00 down server
我想删除“00:00 down”,这样它只显示“server”

我尝试过使用
cut-d'-f2-$string
,结果只是删除了命令搜索的目录


有什么想法吗?

使用
-d
选项将delimtier设置为空格

$ 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`
...
...

请把事情做好:

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

检查各种主题

您也可以使用sed:

sed 's/^.* * //'

对于给出的示例,我更喜欢cut。但对于问题所表达的一般问题,上面的答案有一些小缺点。例如,当您不知道单词之间有多少空格(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将一行中的2个与
{m,n}
表达式精确匹配,其中n是可选的,m是2。前导的
\s*
意味着修剪前导的空格。

我必须承认,我也有同样的坏习惯,所以我开始寻找在这种情况下不应该使用ls的原因。谢谢你的链接+1。不管怎么说,FAQ相当大,所以为了节省其他人的时间,为什么不应该使用ls,请参见:只要单词正好由一个空格分隔,这就可以工作。