Bash: как обрезать пробелы перед использованием cut
у меня есть строка вывода команды такой:
[]$ <command> | grep "Memory Limit"
Memory Limit: 12345 KB
Я пытаюсь вытащить 12345. Первый шаг-разделение двоеточием-отлично работает
[]$ <command> | grep "Memory Limit" | cut -d ':' -f2
12345 KB
попытка отделить это то, что сложно. Как я могу обрезать пробелы так, чтобы cut -d ' ' -f1
возвращает "12345", а не пустым?
6 ответов
передайте свою команду awk, распечатайте 3-й столбец, пробел и 4-й столбец, как это
<command> | awk '{print , }'
в результате:
12345 KB
или
<command> | awk '{print }'
Если вы хотите голый номер.
можно использовать awk
и избегайте использования любого cut, sed или regex:
<command> | awk '/Memory Limit/{print $(NF-1)}'
12345
-
/Memory Limit/
сделает эту печать только строку сMemory Limit
текст -
$(NF-1)
вамlast-1
го в поле ввода.
вы должны использовать cut
? cut
предназначен только для извлечения одного разделителя символов. я не думаю, что вырезать может быть так просто, как вы ожидали.
sed
просто:
$ echo "Memory Limit: 12345 KB" | sed 's/.*:\s*//'
12345 KB
объяснение:
.*:\s*
соответствует всем буквам перед последним двоеточием, затем соответствует всем пустым символам после этого и удаляет их, подставляя пустую строку.
оказывается, вы ожидали одно число. тогда я бы скажем, просто идти вперед и соответствовать номерам:
$ echo "Memory Limit: 12345 KB" | grep -o -P '\d+'
12345
bash
также имеет регулярное выражение, соответствующее вы можете использовать.
result=$(<command> | grep "Memory Limit")
regex='Memory Limit:[[:space:]]+([[:digit:]]+)[[:space:]]KB'
if [[ $result =~ $regex ]]; then
result=${BASH_REMATCH[0]}
else
# deal with an unexpected result here
fi
значение $regex
можно отрегулировать по мере необходимости.
tr помогает здесь.
$ echo "Memory Limit: 12345 KB" | tr -s " " | cut -d " " -f3
12345
-
tr -s " "
- выжать все пробелы в один -
cut -d " " -f3
- разделить на столбцы по пробелам и выбрать третий
awk
возможно, лучше всего подходит для этой задачи, но вот неортодоксальный способ
$ grep -oP "(?<=Memory Limit:)\s+[0-9]+" file | xargs
lookbehind для сопоставления метки и вывода только соответствия, используйте xargs, чтобы съесть пробелы