使用grep和cut定界符命令(在bash shell脚本UNIX中)-并进行某种“反转”?

22

所以我有一个文件,其中包含文本:

puddle2_1557936:/home/rogers.williams/folderz/puddle2

我想使用grep命令

grep puddle2_1557936
使用cut命令(或其他必要的命令)混合以仅显示此部分:
/home/rogers.williams/folderz/puddle2

到目前为止,我知道如果这样做

 grep puddle2_1557936 | cut -d ":" -f1

那么它将会显示出来

puddle2_1557936

有没有办法“反转”分隔符截取命令?

注意:解决方案必须以“grep puddle2_15579636”开头。


4
最简单的修复方法是在 cut 命令中使用 -f2 参数。顺便问一句,为什么必须以 grep puddle2_15579636 开头?如果没有这个会发生什么不好的事情吗? - doubleDown
非常感谢!没想到修复如此简单...哈哈。而且它必须以grep puddle2_15579636开头,因为我正在编写一个相当长的脚本,在脚本的那个点上,唯一可用的信息就是那个!除非你看到整个项目,否则很难解释清楚! - DeaIss
1个回答

56

cut命令不需要更改分隔符来显示字符串的右侧。

cut命令的-f选项是由分隔符:分隔的第n个元素,所以您只需键入:

 grep puddle2_1557936 | cut -d ":" -f2

如果你想要一些有趣的解决方案,可以稍作修改,使用 命令:

grep -oP 'puddle2_1557936:\K.*' <<< 'puddle2_1557936:/home/rogers.williams/folderz/puddle2'                                                                        
/home/rogers.williams/folderz/puddle2

或者仍然使用查看

grep -oP '(?<=puddle2_1557936:).*' <<< 'puddle2_1557936:/home/rogers.williams/folderz/puddle2'                                                                    
/home/rogers.williams/folderz/puddle2

或使用

perl -lne '/puddle2_1557936:(.*)/ and print $1' <<< 'puddle2_1557936:/home/rogers.williams/folderz/puddle2'                                                      
/home/rogers.williams/folderz/puddle2

或者使用 (感谢格伦·杰克曼

ruby -F: -ane '/puddle2_1557936/ and puts $F[1]' <<< 'puddle2_1557936:/home/rogers.williams/folderz/puddle2'
/home/rogers.williams/folderz/puddle2

或者使用

awk -F'puddle2_1557936:' '{print $2}'  <<< 'puddle2_1557936:/home/rogers.williams/folderz/puddle2'
/home/rogers.williams/folderz/puddle2

或使用:

python -c 'import sys; print(sys.argv[1].split("puddle2_1557936:")[1])' 'puddle2_1557936:/home/rogers.williams/folderz/puddle2'
/home/rogers.williams/folderz/puddle2

或者仅使用

IFS=: read _ a <<< "puddle2_1557936:/home/rogers.williams/folderz/puddle2"
echo "$a"
/home/rogers.williams/folderz/puddle2

或者在 中使用

js<<EOF
var x = 'puddle2_1557936:/home/rogers.williams/folderz/puddle2'
print(x.substr(x.indexOf(":")+1))
EOF
/home/rogers.williams/folderz/puddle2

或者在中使用

php -r 'preg_match("/puddle2_1557936:(.*)/", $argv[1], $m); echo "$m[1]\n";' 'puddle2_1557936:/home/rogers.williams/folderz/puddle2' 
/home/rogers.williams/folderz/puddle2

1
pythonruby 在哪里?+1 - jaypal singh
只需要bash的内容,但额外的信息也无妨哈哈 - DeaIss
1
正确,你的答案说了一些不同的事情。 :) - jaypal singh
awk -F '/puddle2_1557936/ {print $2}' 实际上是一条编程命令。 - glenn jackman
2
顺便提一下,Ruby非常类似于Perl:ruby -F: -ane '/puddle2_1557936/ and puts $F[1]' - glenn jackman
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接