通过 grep/cut 命令打印特定的单词/数字

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)


Zan*_*nna 8

一个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 两个记住的模式,中间有一个空格


Sor*_*n A 5

这将做到:

cut -d'/' -f5-6 test.txt | tr -s "/" " "
Run Code Online (Sandbox Code Playgroud)


小智 3

如果你处理固定的单词位置,这会起作用:

grep -e 'service_name[0-9]*=' test.txt|awk -F'/' '{ print $5" "$6 }'
Run Code Online (Sandbox Code Playgroud)