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,请参见:只要单词正好由一个空格分隔,这就可以工作。