Powiedz, że uruchomiłem polecenie SayStuff
$ SayStuff
i wynik jest
Watermelons and cucumbers
Teraz. Powiedzmy, że chcę wyodrębnić podciąg cucumbers
z wyjścia i potokować go w coś.
Sposób, w jaki poradziłbym sobie z tym programowo, byłoby podzielenie wyniku na tablicę przez separator Space i odwołanie do niego ArrayName[2]
. Jestem całkiem nowym użytkownikiem skryptów powłoki i udało mi się jedynie wykopać półkryptyczne cut
przykłady, z których żaden nie miał sensu.
Jakieś pomysły?
linux
command-line
bash
krystah
źródło
źródło
cut
nie obsłuży zmiennej liczby spacji, podczas gdyawk
.Prawdopodobnie skorzystałbym z jednej z opcji podanych już przez @slhck, ale oto kilka innych sposobów na zrobienie tego:
Używanie tablic, tak jak w każdym innym języku:
var=()
Deklaruje tablicę,$(command)
zapisuje dane wyjściowe polecenia. Więcfoo=( $(SayStuff) )
zapisuje wyjścieSayStuff
do tablicyfoo
i yuou wtedyecho
to trzeci element z${foo[2]}
.sed
sed
Polecenie zastąpić (s///
) wszystko z ostatniego słowa. Wyrażenie regularne dopasowuje wszystko do spacji (.*
), która dopasuje wszystko do ostatniej spacji, a następnie przechwytuje ostatnie słowo(\(.*\)
. Ponieważ słowo zostało przechwycone, możemy go nazwać jako\1
.Prostsza wersja:
grzmotnąć
Wykorzystuje to zdolności manipulacji ciągiem bash, zobacz tutaj po więcej szczegółów.
Więcej bashu
Perl, gdzie oczywiście jest na to wiele sposobów:
Te
-a
markiperl
zachowują się jakawk
, na liniach rozdzielających spacji i zapisywanie do tablicy@F
. Następnie drukujemy ostatni element@F
($#F
to liczba elementów w@F
).-l
Mówi Perl, aby dodać nową linię do każdejprint
deklaracji,-n
że powinien on przetwarzać STDIN linia po linii i-e
że powinien uruchomić skrypt podany w wierszu poleceń.Opcje zostały wyjaśnione powyżej, po prostu usuwamy wszystko do ostatniej spacji i print (
-p
).Podajemy tutaj
Watermelons and cucumbers
jako argumenty, które perl zapisze w@ARG
tablicy, więc wypisujemy ostatni element@ARG
.naciągnięcie. Ten służy
sed
do konwersji spacji na znaki nowej linii, a następnietail
do drukowania tylko ostatniego wiersza.grep i wyrażenia regularne, za pomocą
-o
których wypisuje tylko dopasowany ciąg.oszukiwanie
źródło
Oto kilka wyjaśnień:
Więc jeśli potrzebujesz trzeciego pola, które jest ograniczone spacjami '', to jest
Jeśli chcesz pole OSTATNIE , prawdopodobnie powinieneś użyć awk .
W takim przypadku staje się:
W
awk
NF jest liczbą pól w linii, więc$NF
oznacza ostatnie pole w linii.źródło