使用 awk 匹配一个词,然后找到另一个词的第一次出现

Use awk to match a word, then find the first occurrence of another word

我正在尝试找到一种方法,在我已经找到匹配词后重新搜索另一个匹配词。

我特别想获取我的其中一台显示器的亮度值。例如,我的 xrandr --verbose 的部分输出如下:

DP-1 connected 1920x1080+1920+0 (0x6e) normal (normal left inverted right x axis y axis) 598mm x 336mm
    Identifier: 0x46
    Timestamp:  73906594
    Subpixel:   horizontal rgb
    Gamma:      1.0:1.0:1.0
    Brightness: 1.0
    Clones:    
    CRTC:       1

我想查找单词 connected 然后找到单词 Brightness 的第一次出现。

我试过的有效方法如下:

xrandr --verbose | awk '/ connected /{print }/Brightness:/{print }'

这给了我以下输出,因为我有两个显示器:

LVDS-1                                                                      
1.0
DP-1
1.0

但是假设我只想要第一次出现的结果我试过这个:

 xrandr --verbose | awk '/LVDS-1/{getline; getline; getline; getline; getline; print[=13=]}'

它按预期工作,为我提供了此特定显示器的亮度值。

但是我不确定后面亮度值是否一直在5行。 所以我一直在寻找更强大的解决方案。

如果我没理解错的话,您想打印特定显示器的亮度。我们假设是 LVDS-1。然后你可以使用一个变量来检查你是否在 xrandr 输出的正确 "section" 中并编写如下代码:

xrandr --verbose | awk '/ connected / { if (  == "LVDS-1" ) { print ; print_brightness = 1; } } /Brightness: / { if (print_brightness) { print ; print_brightness = 0; } }'

awk 解决办法:

xrandr --verbose | awk '/LVDS-1/{f=1}/Brightness:/ && f{print ; exit}'

  • /LVDS-1/{f=1} - 在遇到需要 LVDS-1 设置标志的行时 f=1

  • /Brightness:/ && f - 当遇到最近的带有 Brightness: 和活动标志 f 的行时(对于 LVDS-1) - 打印值和 exit脚本立即执行(避免冗余迭代)

xrandr --verbose | awk '/connected/,0 { if( /Brightness:/ ) { print ; exit } }'

范围结束表达式0被解释为false,这意味着一旦范围开始模式(/connected/) 匹配。