bash脚本:从上一行获取数据

时间:2014-02-24 18:01:22

标签: regex perl bash grep

我正在尝试使用以下命令在bash脚本中为我的主监视器提取分辨率:

system_profiler SPDisplaysDataType

它给了我输出:

  Displays:
    Color LCD:
      Display Type: LCD
      Resolution: 1440 x 900
      Pixel Depth: 32-Bit Color (ARGB8888)
      Mirror: Off
      Online: Yes
      Built-In: Yes
    PLL2410W:
      Resolution: 1920 x 1080 @ 60 Hz
      Pixel Depth: 32-Bit Color (ARGB8888)
      Main Display: Yes
      Mirror: Off
      Online: Yes
      Rotation: Supported

我想获得值为Main Display: Yes的显示的分辨率值。我以为我可以使用ggrep进行预测,但我有一些错误:

ggrep -P '(?<=Resolution:\s)[\w\d\s\@]+(?=[\n\w\d:]Main\sDisplay\:\sYes)

Blergh,抱歉看起来很正常。任何建议都会很棒。

谢谢!

4 个答案:

答案 0 :(得分:2)

它不起作用,因为模式与每一行匹配,而不是与整个“文件”匹配。

您可以将整个“文件”加载到内存中,这是以下-0777的结果:

perl -0777nE'say $1 if /Resolution: (.*)(\n {6}.*)*\n {6}Main Display: Yes/'

(这是编码的,如果“分辨率”和“主显示”的顺序被交换,它将不会打印任何内容而不是打印错误的值。换句话说,它安全地失败。)

(如果您需要支持5.8或更早版本,请使用-e代替-Eprint "$1\n"代替say $1。)

答案 1 :(得分:1)

使用awk:

awk -F' *: *' '/Resolution/{p=$2; next} /Main Display: Yes/{print p; exit}'
1920 x 1080 @ 60 Hz

答案 2 :(得分:1)

这是否适合您的需要?

system_profiler SPDisplaysDataType | grep -B3 "Main Display: Yes" | grep "Resolution" | awk -F"Resolution:" '{print $2}'

给出:1920 x 1200 @ 60 Hz(在我的电脑上)

希望这有帮助

答案 3 :(得分:0)

您可以将grep的{​​{1}}选项与-B一起使用,以获得您想要的行:

head

如果“分辨率”行不是“主要显示”行之前的两行,这显然会中断,但对您来说可能不是问题。如果是,那么您应该考虑将输出解析为适当的树结构。

相关问题