Bash 如何打印必填字段

Bash 如何打印必填字段,bash,awk,Bash,Awk,输入行: a b=34 c d="12 34 54" e f=387 a b=12 c z d="89 08 23" e f=321 g=12 我想打印两个字段b和d。 所需的Ouptut类似于: b=34 d="12 34 54" b=12 d="89 08 23" 我试着 awk '{print $2, $4}' filename 但这并不能产生正确的输出。这个sed应该在这里工作: sed -E -n 's/[^b]*(b=[0-9]+) [^d]*(d=".*") [^bd]*/\

输入行:

a b=34 c d="12 34 54" e f=387
a b=12 c z d="89 08 23" e f=321 g=12
我想打印两个字段b和d。
所需的Ouptut类似于:

b=34 d="12 34 54"
b=12 d="89 08 23"
我试着

awk '{print $2, $4}' filename

但这并不能产生正确的输出。

这个
sed
应该在这里工作:

sed -E -n 's/[^b]*(b=[0-9]+) [^d]*(d=".*") [^bd]*/\1 \2/p' file_name
输出:

b=34 d="12 34 54"
b=12 d="89 08 23"

Awk开箱即用不解析带引号的字段。如果要使用Awk提取带引号的字段,则需要实现带引号字段的解析

外壳,开箱即用,可以很好地解析这些;但您可能希望避免将用户输入解析为代码

如果您可以信任输入(即,它来自您完全控制的配置文件),则

string='a b=34 c d="12 34 54" e f=387'
eval "$string"
将其中的所有变量设置为其预期值

不过,您可能希望自己解析字符串。试试这个:

grepvar () {
    grep -Po "$1"'=\K([^"]+|"[^"]*")'
}
a=$(grepvar "a" filename)
b=$(grepvar "b" <<<"$string")

上面显示了如何从名为
filename
的文件中读取,以及如何解析已包含文本的变量
$string
如果可用
gawk
4.0或更高版本,那么如何利用
FPAT

请尝试:

gawk -v FPAT='[^ ]+|\\w+="[^"]+"' '
    {for (i=1; i<=NF; i++) if (match($i, "^(b|d)")) printf("%s ", $i); print ""}
' input.txt

FPAT
,一个
awk
变量,是一个正则表达式,用于匹配每个字段的内容,而不是使用字段分隔符拆分行。

我尝试使用awk,但没有成功,它忽略了引号并像b=34 d那样打印=“12.编辑你的问题,说明你是如何回答的trying@user2402905:请澄清:字段的值始终是数字还是用双引号括起来的以空格分隔的数字列表?这是我很少真正喜欢使用
eval
:)
gawk -v FPAT='[^ ]+|\\w+="[^"]+"' '
    {for (i=1; i<=NF; i++) if (match($i, "^(b|d)")) printf("%s ", $i); print ""}
' input.txt
b=34 d="12 34 54" 
b=12 d="89 08 23"