解析Linux命令输出

时间:2013-12-27 06:47:40

标签: linux parsing awk grep

对于命令, amixer get PCM playback

我的输出是这样的:

 "Simple mixer control 'PCM',0
  Capabilities: pvolume penum
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 255
  Mono:
  Front Left: Playback 255 [100%] [0.00dB]
  Front Right: Playback 255 [100%] [0.00dB]"

现在我需要变量值“100%”;那么,我该如何解析呢?

我得到了[100

amixer get PCM playback | grep "\[" | cut -d '%' -f1 | awk '{print $5}'

3 个答案:

答案 0 :(得分:2)

首先,示例输出中有两个100%个数字;你想要哪个?如果它们始终为100%,那么您只需指定var=100,因此有时可能会小于100%

看起来有点像sed,例如:

amixer get PCM playback | sed -n '/.*\[\([0-9]*\)%].*/s//\1/p'

sed命令应该在两行输出上给你两个数字,左前方的值在右前方。

您使用Command Substitution收集sed变量中的输出:

playback=$(amixer get PCM playback | sed -n '/.*\[\([0-9]*\)%].*/s//\1/p')

这将在playback中给出两个数字。您可能更喜欢使用数组:

playback=( $(amixer get PCM playback | sed -n '/.*\[\([0-9]*\)%].*/s//\1/p') )

现在你可以使用:

left=0
right=1
echo "Left = ${playback[$left]}"
echo "Right = ${playback[$right]}"

这假设您使用bash作为shell。

答案 1 :(得分:2)

这是一种方法。
将左侧值存储在变量left

left=$(amixer get PCM playback | awk -F"[%[]" '/Left:/ {print $2}')


将正确的值存储在变量right

right=$(amixer get PCM playback | awk -F"[%[]" '/Right:/ {print $2}')


或者将这两个数据存储在变量db

db=$(amixer get PCM playback | awk  -F"[%[]" '/dB/ {print $2}')
echo "$db"
100
100

答案 2 :(得分:1)

使用Gnu grep和Perl正则表达式,前瞻性和后瞻性,你可以得到左扬声器的值

grep -Po '(?<=Left: Playback 255 \[)[^]]*(?=%\])'