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
.
linux
command-line
bash
awk
drjrm3
źródło
źródło
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ładzieawk 'FILENAME ~ /^xyz/ { print $1}'
byłoby następstwem, ale nic nie drukuje na ekranie.{print FILENAME}
.--color=auto
. Koloruje wyjście tylko wtedy, gdy trafia do terminala, a nie gdy jest przekierowywane do potoku lub pliku.ls
nie ma potrzeby awk. użyj nazwy pliku glob:
najprawdopodobniej będziesz chciał potokować nazwy plików, aby nad nimi pracować? może tak?
w takim przypadku lepiej jest użyć pętli for.
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ń dlasome other command
.źródło
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./^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.Twoim oryginalnym rozwiązaniem było właśnie brak
^
w regepie, który zakotwicza dopasowanie do początku linii. Nie potrzebujeszprint
blok, ponieważ domyślną akcją przy znalezieniu dopasowania jest wydrukowanie linii. Jeśli chcesz być wyraźny, możesz napisać: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).źródło
/^xyz/
rozwiązanie w moim pierwotnym pytaniu i nie działa w moim systemie. Czy mój problem zależy tylko od systemu?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.