używanie awk tylko na plikach, które START z 'xyz'

0

Mam 3 pliki w katalogu: xyz1.txt, xyz2.txt, rst_xyz.txt i chcę pracować TYLKO z pierwszymi dwoma (tymi, które zaczynają się od xyz). Komenda ls | awk '/xyz/{print $1}' zwróci wszystkie trzy. Jakie zmiany mogę wprowadzić do polecenia, aby określić TYLKO pliki xyz *? próbowałem ls | awk '/^xyz/{print $1}' myśląc, że to sprawi, że plik zacznie się od xyz, ale to nie wyklucza rst_xyz.txt.

drjrm3
źródło

Odpowiedzi:

2

Nie analizuj ls!

Chcesz

awk '...' xyz*

Jeśli z jakiegoś dziwnego powodu chcesz to zrobić całkowicie w awk:

awk 'FILENAME ~ /^xyz/ { .... }' *
glenn jackman
źródło
Dziękuję za radę, aby nie analizować ls - to nigdy nie przyszło mi do głowy! Bardzo dziwnym powodem jest to, że mogę się dokładnie dowiedzieć, jak działa awk i jak w nim implementować wyrażenia regularne. Próbuję po prostu wydrukować wszystkie pliki zaczynające się od „xyz”, jak widać z mojego pierwotnego pytania. W twoim przykładzie awk 'FILENAME ~ /^xyz/ { print $1}' byłoby następstwem, ale nic nie drukuje na ekranie.
drjrm3
@ Laurbert515 Możesz {print FILENAME}.
Barmar
Jak się okazuje, problem polegał na analizie ls. W rzeczywistości używam „ls --color” i kiedy używam „ls --color = none | ...” Dostaję poprawną rzecz za pomocą mojego oryginalnego polecenia.
drjrm3
posługiwać się --color=auto. Koloruje wyjście tylko wtedy, gdy trafia do terminala, a nie gdy jest przekierowywane do potoku lub pliku.
Barmar
@ Laurbert515, kolejny powód, aby nie analizować ls
glenn jackman
1

nie ma potrzeby awk. użyj nazwy pliku glob:

ls xyz*

najprawdopodobniej będziesz chciał potokować nazwy plików, aby nad nimi pracować? może tak?

ls xyz* | some other commands

w takim przypadku lepiej jest użyć pętli for.

for filename in xyz*
do
  some other commands "$filename"
done

zauważ, że w pierwszym wariancie nazwy plików będą traktowane jako strumień do stdin z some other commands podczas gdy w pętli for nazwy plików będą przychodzić jeden po drugim jako argument linii poleceń dla some other command.

lesmana
źródło
Dziękuję Ci. Istnieje wiele sposobów wykonania tego zadania, ale specjalnie pytałem o metodę awk, ponieważ próbuję nauczyć się awk.
drjrm3
dobrze, rozumiem. w takim przypadku powinieneś podać więcej szczegółów na temat swojego systemu, ponieważ awk '/^xyz/{print $1}' działa zgodnie z oczekiwaniami w moim systemie. Twoje pytanie jest prawdopodobnie lepiej zadane na stackoverflow.com, ponieważ jest to pytanie programistyczne.
lesmana
Dziękuję, będę repostować na stackoverflow. Aby być jasnym, /^xyz/ wykonuje żądaną funkcję w systemie? Jeśli tak jest, zaktualizuję moje pytanie na temat stackoverflow o więcej szczegółów na temat mojego systemu, jeśli sam nie będę w stanie rozwiązać problemu.
drjrm3
Nie ma powodu, aby powtarzać to na SO. Znajduje się w nakładce między SU, SO i unix.SE, a jedno pytanie powinno wystarczyć.
Barmar
1
ls | awk '/^xyz/'

Twoim oryginalnym rozwiązaniem było właśnie brak ^ w regepie, który zakotwicza dopasowanie do początku linii. Nie potrzebujesz print blok, ponieważ domyślną akcją przy znalezieniu dopasowania jest wydrukowanie linii. Jeśli chcesz być wyraźny, możesz napisać:

ls | awk '/^xyz/ {print $0}'

Powinieneś użyć $0 zamiast $1 w przypadku, gdy nazwa pliku zawiera spacje (chociaż jeśli nazwa pliku zawiera znak nowej linii, nadal będzie traktowane jako wiele nazw).

Barmar
źródło
Właściwie to mam /^xyz/ rozwiązanie w moim pierwotnym pytaniu i nie działa w moim systemie. Czy mój problem zależy tylko od systemu?
drjrm3
Nie sądzę, aby to było zależne od systemu. Jest to niezwykle podstawowe polecenie i powinno działać w każdej wersji awk. Właśnie wypróbowałem go zarówno na OS X, jak i na Debianie Linux i działało dobrze. Podejrzewam, że pomyliłeś coś podczas próby.
Barmar
Dzięki, zobacz mój komentarz do wybranej odpowiedzi. Pisałem to poprawnie, ale zacząłem wypowiadać słowa „ls --color”, a nie tylko „ls”.
drjrm3