Захватите целое число после одного из нескольких совпадений строк - PullRequest
0 голосов
/ 08 декабря 2018

Я хочу получить напряжение батареи, используя

dumpsys battery

Выходные данные - это что-то вроде этой строки

Current Battery Service state:
  AC powered: false
  USB powered: false
  Wireless powered: false
  Max charging current: 0
  Max charging voltage: 0
  Charge counter: 2208619
  Overload: false
  USB overheat: false
  Extension: 0
  PowerJacketExist: false
  PowerJacketStatus: 0
  PowerJacketLevel: 0
  PluginStatus: false
  Unsupport Charger: false
  status: 3
  health: 2
  present: true
  level: 71
  scale: 100
  voltage: 4008
  temperature: 340
  technology: Li-ion
  mLedLogType: -1
  CutoffVoltage: 0

Мне нужно только 4008 (это значение может измениться) после "напряжения:«Я попробовал этот метод grep, но он не сработал, я думаю, потому что есть несколько совпадений

dumpsys battery | grep voltage

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Вы можете использовать PCRE и позитивный взгляд назад, если ваш grep поддерживает это:

$ grep -oP "(?<=^  voltage: ).*" file 
4008
0 голосов
/ 08 декабря 2018
$ awk -F'(^|:) *' '{f[$2]=$3} END{print f["voltage"]}' file
4008

$ awk -F'(^|:) *' '{f[$2]=$3} END{print f["Max charging voltage"]}' file
0

$ awk -F'(^|:) *' '{f[$2]=$3} END{print f["status"], f["health"], f["scale"]}' file
3 2 100

или для создания CSV из всех полей (например, для импорта в Excel):

$ awk -F'(^|:) *' -v OFS=',' '
{ keys[NR]=$2; vals[$2]=$3 }
END {
    for (i=2; i<=NR; i++) {
        printf "%s%s", keys[i], (i<NR ? OFS : ORS)
    }
    for (i=2; i<=NR; i++) {
        printf "%s%s", vals[keys[i]], (i<NR ? OFS : ORS)
    }
}
' file
AC powered,USB powered,Wireless powered,Max charging current,Max charging voltage,Charge counter,Overload,USB overheat,Extension,PowerJacketExist,PowerJacketStatus,PowerJacketLevel,PluginStatus,Unsupport Charger,status,health,present,level,scale,voltage,temperature,technology,mLedLogType,CutoffVoltage
false,false,false,0,0,2208619,false,false,0,false,0,0,false,false,3,2,true,71,100,4008,340,Li-ion,-1,0
0 голосов
/ 08 декабря 2018

Не могли бы вы попробовать один раз.Это должно напечатать все вхождения строки voltage:.

awk '/^ +voltage:/ && $NF!=0{print $NF}' Input_file

ИЛИ

your_command | awk '/^ +voltage:/ && $NF!=0{print $NF}'

ИЛИ, если вы ДЕЛАЕТЕНЕ хотите нулевого значения напряжения, затем попробуйте выполнить следующее.

awk '/^ +voltage:/ && $NF!=0{print $NF}' Input_file

ИЛИ, если вы хотите 2-го появления строки напряжения, попробуйте выполнить следующее.

awk '/^ +voltage:/ && ++count==2{print $NF}' Input_file

Пояснение: Теперь добавим объяснение вышеуказанного кода.

awk '             ##Starting awk program here.
/^ +voltage:/{       ##Checking condition if a line consist string voltage: then do following.
  print $NF       ##This statement will be execute ONLY when previous condition is TRUE and it will print last field value here.
}'  Input_file    ##Mentioning Input_file name here.

2-е решение: Добавление решения с помощью команды sed и сейчас.

sed -n '/^ +voltage:/s/.*: //p' Input_file

ИЛИ

your_command | sed -n '/^ +voltage:/s/.*: //p'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...