#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