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, чтобы съесть пробелы