我正在尝试实现在特殊字符之间获取文本。您可以按照下面的步骤了解我想要实现的目标。我有必要的命令来执行此操作,但我正在寻找一种更有效的方法,以防某些条件可能根据结果而改变。
下面是文本 On-Line (Prim) 的示例。我想提取“--”第一次和第二次出现之间的任何文本。
所以我在“VAL1”变量中有下面的文本
IBM Informix Dynamic Server Version 14.10.FC10XA -- On-Line (Prim) -- Up 77 days 23:08:31 -- 130337920 Kbytes
因此目前我正在使用以下内容:
echo "$VAL1" | awk -F'--' '$1 ~ /Version/ {print $2}'
以上代码给出以下输出:
On-Line (Prim)
但是,您看不到行尾必须有空格,但开头非常明显。我想确保只打印“--”之间的单词,而不打印“--”内句子前后的任何空格。
因此我尝试使用下面的方法,对我来说似乎不错:
echo "$VAL1" | awk -F'--' '$1 ~ /Version/ {print $2}' | sed 's/^ //g' | sed 's/ *$//'
输出:
On-Line (Prim)
我想知道是否有更好、更简单、更充分的方法来做到这一点?
只需将字段分隔符从 扩展
--
到--
...--
或者仅当行中至少出现 2 次时才打印:或者另一种选择——使用 awk 的
gsub
:由于您使用的是 AIX,因此您应该可以访问支持 perl 正则表达式(有限形式)的 ksh93 shell,您可以在其中执行以下操作:
或者与 zsh 相同(其中 perl 正则表达式通过 PCRE 库支持,因此比 ksh93 具有更完整的支持):
(没有在那里使用
$status
,因为那是保存最后一个命令的退出状态的特殊变量,就像在大多数其他 shell 中一样(除了 Bourne 类的 shell 以外$?
(zsh 也支持它作为别名))。和
awk
:在那里,我们将的值
$VAL1
作为参数传递给awk
而不是传递给它的标准输入,这有几个好处:echo
不能用于任意数据,因为取决于实现和/或编译/运行环境,它会处理一些选项和/或破坏反斜杠(在 ksh/zsh 中使用printf '%s\n' "$VAL1"
或print -r -- "$VAL1"
或使用 heredoc 或 herestring 不会出现问题)。但请注意,由于
awk
是外部命令,这意味着该值对系统上的任何人都是可见的(就像ps
在正确的时间运行的输出一样),并且您可能会遇到参数+环境的大小限制(execve()
默认情况下在 AIX 7.{1..3} 上相对较大(1MiB))。通过环境传递值可以避免第一个问题:
像
FS
(由 设定-F
)一样, 的分隔符参数split()
是一个正则表达式,因此我们可以[[:space:]]*
在那里包含(任意数量的空格)--
。假设OP想要在另一个变量中捕获结果,我们可以执行一对参数替换来代替调用一些子shell来调用
awk
或sed
,例如:GNU awk 信息页面列出了可能具有 trim 函数的附加函数库...
这个站点有一个 ok trim 函数,你可以把它添加到‘GAWK 系统函数库’(我认为那是 ~/.gawkrc 中的一个 cfg 或类似的文件)——
https://gist.github.com/andrewrcollins/1592991
Trim 是一个可以添加到库中的便捷函数。信息页面在初始目录中有这个“函数库”,但它不在手册页等中。