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