使用awk/sed解析此特定字符串的最佳方法?
我需要从文件中获取一个特定的版本字符串(称为version.lst),并使用它来比较shell脚本中的另一个版本字符串。例如,该文件包含如下所示的行:使用awk/sed解析此特定字符串的最佳方法?,sed,awk,grep,Sed,Awk,Grep,我需要从文件中获取一个特定的版本字符串(称为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 。。等等假设我正在尝试从APP1获取第一个版本(在本
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
。。等等假设我正在尝试从APP1获取第一个版本(在本例中为V1.000)。显然,版本可以更改,我希望这是动态的。我现在所做的工作:
var = `cat version.lst | grep " -- APP1" | grep -Eo V[0-9].[0-9]{3}`
到grep的管道将获得包含APP1的行,到grep的第二个管道将获得版本字符串。但是,我听说grep不是实现这一点的最佳方法,所以我想学习使用awk或sed的最佳方法。有什么想法吗?我对这两种语言都是新手,还没有找到一个足够简单的教程来学习它的语法。他们支持白鹭吗?谢谢 如果我理解正确:
egrep“APP1$”version.lst | awk'{print$1}'
$ awk '/^V1\.00.* APP1$/{print $NF}' version.lst
APP1
该正则表达式匹配以“V1.00”开头的行,后跟任意数量的任何其他字符,以“APP1”结尾。中间的反斜杠可能非常重要——它只匹配“.”,因此它排除了(可能是损坏的)可能以“V1A00”开头的行。“APP1”前面的空格不包括“APP2\u APP1”之类的内容
“NF”是一个自动生成的变量,包含输入行中的字段数。它也是最后一个字段的编号,恰好是您感兴趣的字段
有几种方法可以删除“V1”。这里有一个方法,尽管你和我可能谈论的不是完全相同的事情
$ awk '/^V1\.00.* APP1$/{print substr($1, 1, index($1, ".") - 1), $NF}' version.lst
V1 APP1
请尝试以下操作以获取完整版本:
#!/bin/sh
app=APP1
var=$(awk -v "app=$app" '$NF == app {print $1}' version.lst)
var=$(sed -n "/ $app\$/s/^\([^ ]*\).*/\1/p" version.lst)
或者仅获取主要版本号,最后一行可以是:
var=$(awk -v "app=$app" '$NF == app {split($1,a,"."); print a[1]}' version.lst)
使用sed
获取完整版本:
#!/bin/sh
app=APP1
var=$(awk -v "app=$app" '$NF == app {print $1}' version.lst)
var=$(sed -n "/ $app\$/s/^\([^ ]*\).*/\1/p" version.lst)
或仅获取主要版本号:
var=$(sed -n "/ $app\$/s/^\([^.]*\).*/\1/p" version.lst)
说明:
第二个AWK命令:
-将AWK变量设置为shell变量-v“app=$app”
-如果最后一个字段等于变量的内容($NF==app
是字段数,因此NF
是第NFth个字段的内容)$NF
-然后在点处拆分第一个字段{split($1,a,“.”)
-并打印拆分结果的第一部分打印[1]
sed
命令:
-除非指示,否则不要打印任何输出-n
-对于以(“/$app\$/
)结尾的任何一行,shell变量的内容\$
(并非使用双引号来允许展开变量,最好转义第二个美元符号)$app
-从行首(s/^\([^]*\)./\1/p“
)开始,捕获由任意数字(零个或多个^
)的非空格(*
)组成的字符序列,并匹配但不捕获行上的所有剩余字符([^]
),将匹配的文本(本例中为整行)替换为捕获的字符串(版本号)(*
指第一个(本例中仅此一个)捕获组,并打印它(\1
)p