Я искал решение в Bash, которое может извлекать определенную информацию после указанной строки.
Например (от запуска acpi):
Battery 0: Discharging, 37%, 01:33:20 remaining
Как я могу извлечь процент после разряда? В этом случае это будет 37% ...
Я ищу простое решение, которое не требует кучи аргументов команды.
Я не уверен, что вы имеете в виду, говоря «решение в bash», но awk может выполнить задание:
awk -F", " '{print$2}'
-F", " - выбрать запятую, а затем пробел, как F ield delimiter, это разделяет вашу примерную строку в трех столбцах, где вторая - 37% '{print$2}' - печатает второй столбец Или как насчет sed?
sed -E 's/.* ([0-9]+%).*/\1/'
Я не уверен, что вы имеете в виду, говоря «решение в bash», но awk может выполнить задание:
awk -F", " '{print$2}'
-F", " - выбрать запятую, а затем пробел, как F ield delimiter, это разделяет вашу примерную строку в трех столбцах, где вторая - 37% '{print$2}' - печатает второй столбец Или как насчет sed?
sed -E 's/.* ([0-9]+%).*/\1/'
Я не уверен, что вы имеете в виду, говоря «решение в bash», но awk может выполнить задание:
awk -F", " '{print$2}'
-F", " - выбрать запятую, а затем пробел, как F ield delimiter, это разделяет вашу примерную строку в трех столбцах, где вторая - 37% '{print$2}' - печатает второй столбец Или как насчет sed?
sed -E 's/.* ([0-9]+%).*/\1/'
Вот несколько:
$ acpi | grep -oP '\d+%'
99%
$ acpi | awk -F',' '{print $2}'
99%
$ acpi | perl -pe 's/.*?(\d+%).*/$1/'
99%
После указанной строки? Ни один из двух ранее опубликованных ответов не делает этого специально (потому что захват текста после строки не лучший способ получить информацию, которую вы сказали в своем примере).
Вот несколько способов получить текст после строки. Я использовал ваш пример, хотя ответ десерта и ответ тердона дают более подходящие подходы к этому конкретному случаю.
Используйте \K из Perl, например, в grep с -P (разрешить Perl regex) и -o (только для совпадения):
grep -Po 'string\Kdesired'
Где string - выражение, соответствующее тому, что подходит до того, что вы хотите, а desired - выражение, соответствующее тому, что вы хотите вывести. Это полезно, когда нужный шаблон появляется в другом месте в файле / строке (например, это номер, а файл / строка содержит другие номера). В вашем примере это может быть что-то вроде:
$ acpi | grep -Po 'ing, \K[^,]+'
79%
[^,]+ означает некоторые символы, которые не являются запятой, поэтому это может захватывать текст до запятой. Мы могли бы также использовать ... для получения любых трех символов, но, как указано в ответе десерта , возможно, шаблон, который вы хотите здесь, будет больше или меньше 3 символов.
В sed вы можете использовать группы захвата с ( и ):
sed -r 's/.*string(desired).*/\1/'
, где \1 - это то, что было сохранено с ( ). Для вашего примера:
$ acpi | sed -r 's/.*ing, ([^,]+).*/\1/'
89%
Вот способ сделать это с помощью только Bash на вашем примере
$ output=$(acpi); string="${output#*ing, *}"; desired="${string%,*}"; echo "$desired"
96%
${var#string*} fims var до string (включительно) и ${var%string*} var после string (включительно).
Это далеко не полный список. Есть много способов сделать это:)
Решение bash, как и было запрошено, без каких-либо неудобных awkisms или sedulous sedisms:
my_battery=( $(acpi) ); echo ${my_battery[3]}
Это использует подстановку команд, делает массив вывода команды и отображает 4-й элемент массива.
Это работает с выходом acpi, который, по-видимому, всегда имеет процент батареи в качестве 4-го параметра. Если вы хотите найти элемент массива после «Discharging», вы не получите результат, если acpi сообщит вам «Батарея 0: полная, 100%».
Вы также можете использовать извлечение подстроки с расширением параметра
input=$(acpi)
expr "${input#*,[[:space:]]}" : '\([^,]*\)'
Вы также можете использовать извлечение подстроки с расширением параметра
input=$(acpi)
expr "${input#*,[[:space:]]}" : '\([^,]*\)'
Вот несколько:
$ acpi | grep -oP '\d+%'
99%
$ acpi | awk -F',' '{print $2}'
99%
$ acpi | perl -pe 's/.*?(\d+%).*/$1/'
99%
Решение bash, как и было запрошено, без каких-либо неудобных awkisms или sedulous sedisms:
my_battery=( $(acpi) ); echo ${my_battery[3]}
Это использует подстановку команд, делает массив вывода команды и отображает 4-й элемент массива.
Это работает с выходом acpi, который, по-видимому, всегда имеет процент батареи в качестве 4-го параметра. Если вы хотите найти элемент массива после «Discharging», вы не получите результат, если acpi сообщит вам «Батарея 0: полная, 100%».
Вы также можете использовать извлечение подстроки с расширением параметра
input=$(acpi)
expr "${input#*,[[:space:]]}" : '\([^,]*\)'
Вот несколько:
$ acpi | grep -oP '\d+%'
99%
$ acpi | awk -F',' '{print $2}'
99%
$ acpi | perl -pe 's/.*?(\d+%).*/$1/'
99%
Решение bash, как и было запрошено, без каких-либо неудобных awkisms или sedulous sedisms:
my_battery=( $(acpi) ); echo ${my_battery[3]}
Это использует подстановку команд, делает массив вывода команды и отображает 4-й элемент массива.
Это работает с выходом acpi, который, по-видимому, всегда имеет процент батареи в качестве 4-го параметра. Если вы хотите найти элемент массива после «Discharging», вы не получите результат, если acpi сообщит вам «Батарея 0: полная, 100%».