2016-08-05 8 views
4

У меня есть строка вывода из команды вроде этого:Bash: Как обрезать пробелы перед использованием вырезать

[]$ <command> | grep "Memory Limit" 
Memory Limit:   12345 KB 

Я пытаюсь вытащить 12345. первый шаг - разделение по толстой кишке - отлично работает

[]$ <command> | grep "Memory Limit" | cut -d ':' -f2 
      12345 KB 

Пытается отделить это то, что сложно. Как я могу обрезать пробелы, так что cut -d ' ' -f1 возвращает «12345», а не пробел?

ответ

4

Pipe ваша команда AWK, печать 3-й столбец, пространство и 4-й столбец, как этот

<command> | awk '{print $3, $4}' 

Это приводит к:

12345 KB 

или

<command> | awk '{print $3}' 

если вы хотите голый номер.

+0

Я бы предложил заменить' '' '' '' '', поскольку 'awk' имеет' OFS' по умолчанию, значение которого равно одному. Существующая команда не ошибается, просто имея в ней некоторые необоснованные вещи. Пример 'awk '{print $ 3" ​​"$ 4}' и' awk '{print $ 3, $ 4}' 'приведет к тому же выводу в случае по умолчанию' OFS'. –

+1

@PS. Конечно ты прав. Большое спасибо за подсказку. Я внес изменения в свой пост. –

2

у вас есть cut? cut предназначен для выделения только одного символа. я не думаю, что вырезать можно так просто, как вы ожидали.

sed прост:

$ echo "Memory Limit:   12345 KB" | sed 's/.*:\s*//' 
12345 KB 

объяснение:

.*:\s* матчи все буквы до последней ободочной кишки, затем сопоставляет все пустые символы после этого и удалить их путем замены на пустую строку.


Оказалось, что вы ожидали одного номера. то я бы сказал, просто идти вперед и соответствуют номерам:

$ echo "Memory Limit:   12345 KB" | grep -o -P '\d+' 
12345 
3

Вы можете использовать awk и избегать использования каких-либо вырезать, СЭД или регулярное выражение:

<command> | awk '/Memory Limit/{print $(NF-1)}' 

12345 
  • /Memory Limit/ сделает этот принт только линию с Memory Limit текст
  • $(NF-1) доставит вас last-1 th поле ввода.
+1

Предположительно '' выводит больше строк, чем один, содержащий «Ограничение памяти». Было бы нелегко сделать 'awk' select that wanted line вместо использования отдельного' grep', но вам нужно сделать то или другое. –

+0

Да в этом случае: ' | awk '/ Memory/{print $ (NF-1)}' 'должен работать – anubhava

0

awk, пожалуй, лучше всего подходит для этой задачи, но вот неортодоксальные стороннюю

$ grep -oP "(?<=Memory Limit:)\s+[0-9]+" file | xargs 

'назад для согласования метки и вывода только соответствие, использование xargs съедать пространства

1

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 может быть скорректировано при необходимости.

0

tr помогает здесь.

$ echo "Memory Limit:   12345 KB" | tr -s " " | cut -d " " -f3 
12345 
  • tr -s " " - сжать все пробелы в один
  • cut -d " " -f3 - расщепляются на колонках с помощью пространства и выберите третий
Смежные вопросы