Mam plik zawierający następujące wiersze:
/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com
W powyższym wyjściu chcę wyodrębnić 3 pola (numer 2, 4 i ostatnie *.example.com
). Otrzymuję następujące dane wyjściowe:
cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001 tomcat7.1
tc0001 tomcat7.2
tc0001 tomcat7.5
Jak wyodrębnić ostatnie pole z nazwą domeny, która jest później '='
? Jak użyć multiple delimiter
do wyodrębnienia pola?
awk
command-line
text-processing
Satish
źródło
źródło
awk
przełykałem pola, gdy były puste, co oznaczało numerację pól. Zmieniłem-F " "
się-F "[ ]"
iawk
już nie połykałem pustych pól.Odpowiedzi:
Separator może być wyrażeniem regularnym.
Produkuje:
źródło
cat
proces ten nie jest wymagane:awk '...' file
. Również bardziej pomocne byłoby użycie separatora pola wyjściowego:awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'
|
: Ex:awk -F 'this|that|[=/]' '......'
(usefull mieć słów / łańcuchy oddzielające rzeczy) (uwaga, że ta utrzymuje przestrzenie w fiels między 2 separatory Dodawanie również.|[ \t]+
mogą być przydatne, ale można zrobić rzeczy trudne ... ponieważ przed i po tym są często spacje, między tymi polami i „tym” pojawią się 2 dodatkowe puste polaDobre wieści!
awk
separator pól może być wyrażeniem regularnym. Musisz tylko użyć-F"<separator1>|<separator2>|..."
:Zwroty:
Tutaj:
-F"/|="
ustawia separator pola wejściowego na jeden/
lub=
. Następnie ustawia separator pola wyjściowego na tabulator.-vOFS='\t'
używa-v
flagi do ustawiania zmiennej.OFS
jest zmienną domyślną dla Separatora pól wyjściowych i jest ustawiony na znak tabulacji. Flaga jest konieczna, ponieważ nie ma wbudowanego dla OFS jak-F
.{print $3, $5, $NF}
drukuje 3., 5. i ostatnie pole na podstawie separatora pól wejściowych.Zobacz inny przykład:
Ten plik ma dwa separatory pól
#
i_
. Jeśli chcemy wydrukować drugie pole niezależnie od tego, czy separator jest jednym, czy drugim, niech oba będą separatorami!Gdzie pliki są ponumerowane w następujący sposób:
źródło
Jeśli biała spacja jest spójna, możesz użyć jej jako separatora, a także zamiast
\t
bezpośredniego wstawiania , możesz ustawić separator wyjściowy i zostanie on dołączony automatycznie:źródło
Dla separatora pól dowolnej liczby
2
przez5
lub listowniea
lub#
lub miejsca, w którym znak oddzielający należy powtórzyć co najmniej 2 razy i nie więcej niż 6 razy, na przykład:Jestem pewien, że istnieją odmiany tego przy użyciu () i parametrów
źródło
Perl One-Liner:
Używane są następujące opcje wiersza polecenia:
-n
pętla wokół każdej linii pliku wejściowego, wstaw linię do$_
zmiennej, nie drukuj automatycznie każdej linii-l
usuwa nowe linie przed przetwarzaniem i dodaje je z powrotem-a
tryb autosplit - perl automatycznie podzieli linie wejściowe na@F
tablicę. Domyślnie podział na białe znaki-F
modyfikator autosplit, w tym przykładzie dzieli się na jeden/
lub=
-e
wykonaj kod perlaPerl jest ściśle związany z awk, jednak
@F
tablica autosplit zaczyna się od indeksu,$F[0]
a pola awk zaczynają się od 1 $.źródło
Innym jest użycie opcji -F, ale przekazanie wyrażenia regularnego w celu wydrukowania tekstu między lewym i prawym nawiasiem
()
.Zawartość pliku:
Komenda:
wynik:
Za pomocą awk wystarczy wydrukować tekst pomiędzy
[]
:Użyj,
awk -F'[][]'
aleawk -F'[[]]'
nie zadziała.http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html
źródło
Widzę wiele doskonałych odpowiedzi na tablicy, ale nadal chciałbym przesłać mój kawałek kodu,
awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'
źródło
print $3 " " $5 " " $7
można wydrukować tak jakprint $3, $5, $7
. Poza tym nie widzę korzyści z używania awk, a następnie pipowania do sed. Ogólnie rzecz biorąc, awk może wystarczyć, a inne odpowiedzi to pokazują.