Używanie AWK, aby uzyskać drugą kolumnę

9

Nie mogę uzyskać polecenia awk, aby uzyskać drugą kolumnę danych.

Kod Bash:

filter_data=$(awk "{if(/$filter:/) print $2}" < scanresults_temp.txt)

printf  "$filter_data \n"

Zmienna $ filter jest wartością parametru Download lub Upload, która jest przekazywana do skryptu powłoki. Tak więc awk używa terminu Pobierz lub Prześlij, aby wyszukać odpowiedni wiersz.

Zawartość pliku to:

Testing download speed................................................................................
Download: 51.13 Mbit/s
Testing upload speed................................................................................................
Upload: 57.38 Mbit/s

Próbuję dostać tylko numery, a nie cokolwiek innego, EX, 51.13oraz 57.38.

Vlad
źródło
2
Po co zapisywać go w zmiennej, jeśli od razu go drukujesz? Wystarczy użyć awk'sprintf
Sergiy Kolodyazhnyy

Odpowiedzi:

13

Musisz użyć pojedynczych cudzysłowów dla treści programu awk, aby zmienne awk nie były rozwijane przez powłokę. Oto jak powinieneś przekazać zmienną powłoki do awk:

filter_data=$( awk -v re="$filter:" '$0 ~ re {print $2}' scanresults_temp.txt )
Glenn Jackman
źródło
7

Alternatywnym sposobem jest pozwolenie powłoce na umieszczenie zmiennej w awkśrodowisku s poprzez kontynuowanie przypisania (tymczasowe):

re=$filter  awk  '$0 ~ ENVIRON["re"] {print $2}'  input.txt

Zauważ, że cytowanie zmiennych nie jest konieczne podczas wykonywania przypisań w powłoce

Sergiy Kolodyazhnyy
źródło