Linux 要使用awk根据订单切换2个值吗

Linux 要使用awk根据订单切换2个值吗,linux,bash,shell,awk,sed,Linux,Bash,Shell,Awk,Sed,我对awk/sed/grep非常不熟悉,一直在努力寻找问题的解决方案。我有一个BIOS配置文件,如下所示 ... Dual Boot Order #1=0001 Dual Boot Order #2=0002 Dual Boot Order #3=0003 ... Dual Boot Order #15=000E ... 我想做的是检测某个值是否在#1位置,如果不在,则稍后在引导顺序列表中找到它,并使用当前在#1位置的任何值进行切换。例如,如果我想优先考虑000E引导选项,我希望我

我对awk/sed/grep非常不熟悉,一直在努力寻找问题的解决方案。我有一个BIOS配置文件,如下所示

...

Dual Boot Order #1=0001

Dual Boot Order #2=0002

Dual Boot Order #3=0003

...

Dual Boot Order #15=000E

...
我想做的是检测某个值是否在#1位置,如果不在,则稍后在引导顺序列表中找到它,并使用当前在#1位置的任何值进行切换。例如,如果我想优先考虑000E引导选项,我希望我的输出是

...

Dual Boot Order #1=000E

Dual Boot Order #2=0002

Dual Boot Order #3=0003

...

Dual Boot Order #15=0001

...
我目前正在将该值存储在shell变量的#1中,并计划检查它,并根据该值执行下一个命令

temp=$(awk '/Dual Boot Order #1=..../ { if ( $4 != "#1=000E" ) print $4 }' file.txt)

之后我还需要保存这些更改。有人知道一种更直接的方法来实现这一点吗?谢谢

让我们从这个测试文件开始:

$ cat configfile 
...
Dual Boot Order #1=0001
Dual Boot Order #2=0002
Dual Boot Order #3=0003
...
Dual Boot Order #15=000E
...
现在,如果我们想将
000E
交换到第一位:

$ awk -v x=000E '$4~x {sub(/=.*/, a, $4)} $4~/#1=/{a=$4; sub(/^[^=]*/, "", a); $4="#1="x} 1' configfile
...
Dual Boot Order #1=000E
Dual Boot Order #2=0002
Dual Boot Order #3=0003
...
Dual Boot Order #15=0001
...
如果您有GNU awk(gawk),并且您希望就地更改文件:

工作原理
  • -vx=000E

    这定义了一个awk变量
    x
    ,其值为
    000E

  • $4~x{sub(/=.*/,a,$4)}

    如果第四个字段是与
    x
    匹配的正则表达式,则将其更新为
    a
    (从
    #1
    保存的值)

  • $4~/#1=/{a=$4;sub(/^[^=]*/,“”,a);$4=“#1=“x}

    如果第四个字段用于
    #1
    ,则(a)将其当前值保存到
    a
    ,并(b)将其值更新到
    x

  • 1

    这是awk对打印行的神秘速记


    • 另一个类似的
      awk

      $ awk -F= -v OFS="=" -v v="000E" '$2==v{$2=t} $1~/#1$/{t=$2;$2=v} 1' file
      ...
      
      Dual Boot Order #1=000E
      
      Dual Boot Order #2=0002
      
      Dual Boot Order #3=0003
      
      ...
      
      Dual Boot Order #15=0001
      
      ...
      

      请显示您的示例输入所需的输出或结果。基本上,如果我想先使用000E,我需要双启动顺序#1=000E和双启动顺序#15=0001Wow,非常令人印象深刻。使用sed/awk/grep套件,我有很多东西需要学习。使用-v来使用awk变量和子函数对我来说是新的。谢谢@德维吉利很高兴这有帮助。
      $ awk -F= -v OFS="=" -v v="000E" '$2==v{$2=t} $1~/#1$/{t=$2;$2=v} 1' file
      ...
      
      Dual Boot Order #1=000E
      
      Dual Boot Order #2=0002
      
      Dual Boot Order #3=0003
      
      ...
      
      Dual Boot Order #15=0001
      
      ...