我想删除输出字符串中出现的前两个单词。这个字符串也在另一个字符串中。
我有什么:
for servers in `ls /data/field`
do
string=`cat /data/field/$servers/time`
发送此文字:
00:00 down server
我想删除" 00:00"所以它只显示" server"。
我尝试使用cut -d ' ' -f2- $string
,最终只删除命令搜索的目录。
有什么想法吗?
答案 0 :(得分:6)
请做好事情:
for servers in /data/field/*; do
string=$(cut -d" " -f3- /data/field/$servers/time)
echo "$string"
done
$( )
ls
输出,请使用glob
,就像我使用data/field/*
一样答案 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} }表示修剪前导空格。