使用 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/
) 匹配。
我正在尝试找到一种方法,在我已经找到匹配词后重新搜索另一个匹配词。
我特别想获取我的其中一台显示器的亮度值。例如,我的 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/
) 匹配。