печать части поля с помощью awk

#awk

#awk

Вопрос:

Я запускаю:

   ss -atp | grep -vi state | awk '{ print $2"   "$3"   "$4"  "$5"   "$6 }' 
 

вывод:

 0   0   192.168.1.14:49254  92.222.106.156:http   users:(("firefox-esr",pid=696,fd=95))
 

Из последнего столбца я хочу удалить все, кроме firefox-esr (в данном случае); точнее, я хочу извлечь только то, что находится между "" ними.

Я пытался:

 ss -atp | grep -vi state | awk '{ sub(/users:(("/,"",$6); print $2"    "$3"   "$4"   "$5"    "$6 }'
0    0   192.168.1.14:49254   92.222.106.156:http    firefox-esr",pid=696,fd=95))
 

Остается еще удалить последнюю часть; проблема в том, что pid и fd не являются постоянным значением и постоянно меняются.

Комментарии:

1. grep -vi state | awk '{do stuff}' = awk 'tolower($0) !~ /state/{do stuff}' . Если вы покажете нам результат ss -atp , который вам нужен для анализа скрипта, мы сможем вам в этом помочь.

Ответ №1:

Для этого можно использовать gensub возможность ссылки. Для простоты пусть file.txt содержимое будет

 users:(("firefox-esr",pid=696,fd=95))
 

затем

 awk '{print gensub(/.*"(. )".*/,"\1",1,$1)}' file.txt
 

выводит:

 firefox-esr
 

Имейте в виду, что gensub не изменяйте строку, которую она получает в качестве 4-го аргумента, но возвращайте новую строку, поэтому я print ее.

Комментарии:

1. @@Daweo: Не могли бы вы, пожалуйста, объяснить \ 1,1,$ 1?

2. Первым аргументом является регулярное выражение, которое будет охватывать всю ширину столбца с так называемой группой, заключенной в ( ) — в данном случае все между " и " . \1 обозначает содержимое первой (и в данном случае единственной) группы. 1 обозначает первое (и в данном случае единственное) совпадение. $1 обозначает первый столбец (для простоты я использовал пример только с одним столбцом). Дополнительные сведения о gensub функции и примерах см. В документации по функциям управления строками GNU AWK

Ответ №2:

Вы можете использовать

 awk '{ gsub(/^[^"]*"|".*/, "", $6); print $2"   "$3"   "$4"  "$5"   "$6 }' 
 

Здесь gsub(/^[^"]*"|".*/, "", $6) в качестве входных данных будет использовано поле 6 и удалены все символы от начала до первого " , включающего его (см. ^[^"]*" Часть), а затем следующий " и весь текст после него (с использованием ".* ).

Посмотрите эту онлайн awk -демонстрацию:

 s='0 0   0   192.168.1.14:49254  92.222.106.156:http   users:(("firefox-esr",pid=696,fd=95))'
awk '{gsub(/^[^"]*"|".*/, "",$6); print $2"   "$3"   "$4"  "$5"   "$6 }' <<< "$s"
# => 0   0   192.168.1.14:49254  92.222.106.156:http   firefox-esr