2017-05-27 46 views
1

我試圖找到一種方法在我已經匹配後重新搜索另一個匹配單詞。使用awk來匹配單詞,然後找到另一個單詞的第一個出現

我特別試圖獲得我的顯示器之一的亮度值。比如我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}' 

它按照預期給我此特定顯示器的亮度值。

但我不確定亮度值是否總是在5行以後。 所以我一直在尋找更強大的解決方案。

回答

1

AWK解決方案:

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

  • /LVDS-1/{f=1} - 遇到需要的行LVDS-1 set flag f=1

  • /Brightness:/ && f - 遇到與Brightness:最接近線和有效標誌f(爲LVDS-1)時 - 立即打印值和exit腳本執行(避免冗餘迭代)

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; } }' 
+0

這也是正確的,非常感謝你的詳細答案,我選擇羅馬的答案,但因爲它更短。 –

+0

@ChristosTselepidas,不僅更短,而且會避免多餘的記錄迭代 – RomanPerekhrest

0

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

範圍結束表達式0被解釋爲false,這意味着一旦開始運行,範圍將盡可能擴展ge模式(/connected/)匹配。

相關問題