使用awk匹配单词,然后找到另一个单词

时间:2017-05-27 19:40:09

标签: regex linux awk sed xrandr

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

我特意尝试获取其中一台显示器的亮度值。例如,我的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

我想查找连接词,然后第一次出现“亮度”这个词。

我尝试过的是以下内容:

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

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

LVDS-1                                                                      
1.0
DP-1
1.0

但假设我只希望第一次出现结果,我试过这个:

 xrandr --verbose | awk '/LVDS-1/{getline; getline; getline; getline; getline; print$0}'

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

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

3 个答案:

答案 0 :(得分:1)

awk 解决方案:

xrandr --verbose | awk '/LVDS-1/{f=1}/Brightness:/ && f{print $2; exit}'
  • /LVDS-1/{f=1} - 遇到需要LVDS-1设置标记的行f=1

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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