使用awk/sed解析这个特定字符串的最佳方法?

Jac*_*ack 6 awk grep sed

我需要从文件中获取特定的版本字符串(称之为version.lst)并使用它来比较shell脚本中的另一个.例如,该文件包含如下所示的行:

V1.000 -- build date and other info here -- APP1
V1.000 -- build date and other info here -- APP2
V1.500 -- build date and other info here -- APP3
Run Code Online (Sandbox Code Playgroud)

.. 等等.假设我试图从APP1获取第一个版本(在本例中为V1.000).显然,版本可以改变,我希望它是动态的.我现在所做的工作:

var = `cat version.lst | grep " -- APP1" | grep -Eo V[0-9].[0-9]{3}`
Run Code Online (Sandbox Code Playgroud)

管道到grep将获得包含APP1的行,第二个管道到grep将获得版本字符串.但是,我听说grep不是这样做的,所以我想学习使用awk或sed的最佳方法.有任何想法吗?我是两个新手,并没有找到足够简单的教程来学习它的语法.他们支持egrep吗?谢谢!

Pau*_*ce. 11

试试这个来获得完整版本:

#!/bin/sh
app=APP1
var=$(awk -v "app=$app" '$NF == app {print $1}' version.lst)
Run Code Online (Sandbox Code Playgroud)

或者只获得主要版本号,最后一行可以是:

var=$(awk -v "app=$app" '$NF == app {split($1,a,"."); print a[1]}' version.lst)
Run Code Online (Sandbox Code Playgroud)

使用sed以获得完整版本:

var=$(sed -n "/ $app\$/s/^\([^ ]*\).*/\1/p" version.lst)
Run Code Online (Sandbox Code Playgroud)

或者这只得到主版本号:

var=$(sed -n "/ $app\$/s/^\([^.]*\).*/\1/p" version.lst)
Run Code Online (Sandbox Code Playgroud)

说明:

第二个AWK命令:

  • -v "app=$app" - 将AWK变量设置为等于shell变量
  • $NF == app- 如果最后一个字段等于变量的内容(NF是字段数,$NF则第N个字段的内容也是如此)
  • {split($1,a,".") - 然后在点处分割第一个字段
  • print a[1] - 并打印拆分结果的第一部分

sed命令:

  • -n - 除非指示,否则不要打印任何输出
  • "/ $app\$/- 对于以(\$)结束的任何行,以shell变量的内容为例$app(不是用双引号来扩展变量,最好是逃避第二个美元符号)
  • s/^\([^ ]*\).*/\1/p"- 从line(^)的开头开始,捕获\(\)[^ ]任意数字(零或更多*)的非空格()(或第二个版本中的非点)组成的字符序列并匹配但不捕获全部line(.*)上的其余字符,将匹配的文本(在本例中为整行)替换为捕获的字符串(版本号)(\1指第一个(仅在此情况下)捕获组,并且打印它(p)