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

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

我有一个文件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

等等直到service_name1500

我想要像这样的输出:

egg 12.34.56
joker 23.45.67

等等:版本号以及其前的单词。

答案1

这应该是一项简单的cut工作:

cut -d/ -f5,6 --output-delimiter=" "
  • -d/将输入分隔符设置为/
  • -f5,6仅输出第 5 和第 6 个字段
  • --output-delimiter=" "将输出分隔符设置为空格

与 相同awkawk默认情况下将输出字段分隔符设置为空格:

awk -F/ '{print $5,$6}'

例子:

% 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

答案2

一种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

解释

  • -r使用 ERE,这样我们就不必转义()元字符
  • s#old#new#找到模式old并替换为new
  • .*匹配此位置上的任意字符或者不匹配任何字符
  • (stuff)记住stuff
  • [0-9]{2}\.[0-9]{2}\.[0-9]{2}[2 位数字].[2 位数字].[2 位数字] 的模式
  • \1 \2两个记住的模式之间有一个空格

答案3

这将做到这一点:

cut -d'/' -f5-6 test.txt | tr -s "/" " "

答案4

$sed -r 's/.*\/([[:alpha:]]+)\/([\.0-9]*)\/.*/\1 \2/' test.txt

解释:

  • .*在开头和结尾处剪切所有不匹配以下内容的字符
  • ([[:alpha:]]+)括号中的第一个子组仅匹配字母字符
  • \/匹配将被剪掉的斜线
  • 下一个子组([\.0-9]*)匹配数字和点并将其存储在第二个寄存器中
  • 单斜线后面/是替换,\1 \2插入匹配子组中的第一个和第二个寄存器

相关内容