AWK получить конкретную картину

У меня есть такие строки:

Volume.Free_IBM_LUN59_28D:      2072083693568

Я хотел бы получить только IBM_LUN59_28D из этой строки, используя awk.

Спасибо

4 ответа

Ты можешь использовать sub выполнить подстановки в каждой строке ввода в соответствии со следующей стенограммой:

pax> echo 'Volume.Free_IBM_LUN59_28D:      2072083693568' | awk '
...> {
...>     sub (".*Free_", "");
...>     sub (":.*", "");
...>     print
...> }'
IBM_LUN59_28D

Эта команда пересекает несколько строк для удобства чтения, но если вы работаете с файлом и не слишком заинтересованы в удобочитаемости, вы можете просто использовать сжатую версию:

awk '{sub(".*Free_","");sub(":.*","");print}' inputFile

Если вы поддаются не awk решения, вы также можете использовать sed:

sed -e 's/.*Free_//' -e 's/:.*//' inputFile

Обратите внимание, что оба эти решения основаны на ваших (несколько разреженных) тестовых данных. Если ваше определение "нравится" включает в себя предыдущие текстовые сегменты, кроме Free_ или последующие символы, кроме :, может потребоваться дополнительная работа.

Например, если вы хотите строку между первым _ и первый :, вы можете использовать:

awk '{sub("[^_]*_","");sub(":.*","");print}'

Вот один awk

awk -F"Free_" 'NF>1{split($2,a,":");print a[1]}'

Eks:

echo "Volume.Free_IBM_LUN59_28D:      2072083693568" | awk -F"Free_" 'NF>1{split($2,a,":");print a[1]}'
IBM_LUN59_28D

Делит линию на Free_,
Если строка, то иметь более одного поля NF>1 затем:
Сплит второе поле пока : и распечатать первую часть a[1]

С awk:

echo "$val" | awk -F: '{print $1}' | awk -F. '{print $2}' | awk '{print substr($0,6)}'

где данная строка находится в $val.

С помощью sed:

sed 's/[^_]*_\(.*\):.*/\1/'

Поиск последовательности не _ символы, сопровождаемые _ (это будет соответствовать Volume.Free_), затем другая последовательность символов (это будет соответствовать IBM_LUN59_28D, мы сгруппируем это для будущего использования), затем : и любая последовательность символов. Заменить с сохраненным рисунком (\1). Вот и все.

Образец:

$ echo "Volume.Free_IBM_LUN59_28D:      2072083693568" | sed 's/[^_]*_\(.*\):.*/\1/'
IBM_LUN59_28D
Другие вопросы по тегам