Don*_*ald 7 command-line grep text-processing
我有一个文件test.txt,其中包含以下结果:
service_name1= apple/ball/cat/dog/egg/12.34.56/ball/apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl
Run Code Online (Sandbox Code Playgroud)
等等直到 service_name1500
我想要这样的输出:
egg 12.34.56
joker 23.45.67
Run Code Online (Sandbox Code Playgroud)
依此类推:版本号以及之前的单词。
hee*_*ayl 10
这应该是一个简单的cut工作:
cut -d/ -f5,6 --output-delimiter=" "
Run Code Online (Sandbox Code Playgroud)
-d/ 将输入分隔符设置为 /-f5,6 仅输出第 5 个和第 6 个字段--output-delimiter=" " 将输出分隔符设置为空格与awk,awk默认情况下将输出字段分隔符设置为空格:
awk -F/ '{print $5,$6}'
Run Code Online (Sandbox Code Playgroud)
例子:
% cat file.txt
service_name1= apple/ball/cat/dog/egg/12.34.56/ball/apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl
% cut -d/ -f5,6 --output-delimiter=" " file.txt
egg 12.34.56
joker 23.45.67
% awk -F/ '{print $5,$6}' file.txt
egg 12.34.56
joker 23.45.67
Run Code Online (Sandbox Code Playgroud)
一个sed解决方案(不管版本串的字段位置是否一致都有效,但版本串的形式必须一致)
$ sed -r 's#.*/(.*)/([0-9]{2}\.[0-9]{2}\.[0-9]{2}).*#\1 \2#' test.txt
egg 12.34.56
joker 23.45.67
Run Code Online (Sandbox Code Playgroud)
-r使用 ERE 这样我们就不必转义()元字符s#old#new#找到模式old并替换为new.* 匹配此位置的任何字符或不匹配任何字符(stuff)记住stuff以后[0-9]{2}\.[0-9]{2}\.[0-9]{2} [2 位数字].[2 位数字].[2 位数字] 的模式\1 \2 两个记住的模式,中间有一个空格小智 3
如果你处理固定的单词位置,这会起作用:
grep -e 'service_name[0-9]*=' test.txt|awk -F'/' '{ print $5" "$6 }'
Run Code Online (Sandbox Code Playgroud)