Mam przykładowy plik / etc / passwd, taki jak ten:
tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash
Próbuję wyświetlić listę wszystkich użytkowników z folderem domowym /home/
.
napisałem
cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'
gdzie e.txt to tekst, który tutaj skopiowałem.
Rozumiem, że występuje problem z odwrotnym ukośnikiem, który jest znakiem ucieczki, ale jak to naprawić, aby móc wymienić je w jednym wierszu polecenia?
text-processing
awk
wildcards
passwd
erans
źródło
źródło
cat
przesyłać do narzędzi takich jakawk
lubsed
podobnych, ponieważ można podać nazwę pliku jako argument.grep home e.txt | cut -d ":" -f 1
. Gratulujemy nagrody UUOC. Nie jest to jednak dobre rozwiązanie. Co się stanie, jeśli istnieje usługa „homebackups”, która działa pod osobnym użytkownikiem nazwanym na cześć demona? To fałszywie pozytywny wynik.cat > tool
wariantu takich linii poleceń, ponieważ można poprawić przejrzystość, utrzymując przepływ od lewej do prawej wejściowego przetwarzania wyjściowego łańcucha rurowego. To jest mniej wydajny, ale prawie zawsze minimalnie tak. To również sprawia, że dodanie paska postępu w stosownych przypadkach i użyteczne, gdy uruchomiony interaktywnie bardzo oczywiste (wystarczy wymienićcat
zepv
jeśli jest zainstalowany).Odpowiedzi:
Możesz uciec przed ukośnikami, jak pokazano poniżej:
Inną sztuczką byłoby użycie złożonego separatora pól:
-F'[:/]'
- traktować oba:
i/
być separatorem pólźródło
Możesz użyć cudzysłowów zamiast
/
wyrażenia regularnego, aby uniknąć ucieczki przed/
:Z
awk
,{if (foo) ... }
często można uprościć tylkofoo {...}
.źródło
Zakładając, że
e.txt
jest w rzeczywistości/etc/passwd
, należy faktycznie używaćgetent passwd
zamiast parsowania pliku, ponieważ informacja o kontach użytkowników mogą być przechowywane w wielu miejscach określonych w/etc/nsswitch.conf
takich jak LDAP.Zauważ, że
print
instrukcja jest implikowana, gdy warunek jest spełniony. To jednak wydrukuje całą linię. Spowoduje to wydrukowanie tylko nazwy użytkownika:źródło
Alternatywa dla tych z nas, którzy po prostu nie lubią awk:
Wyjaśnienie:
grep -E
umożliwia korzystanie z kilku rozszerzonych funkcji wyrażeń regularnych([^:]*:)
pasuje do jednej kolumny, w tym do następującego separatora „:”^([^:]*:){5}
dopasowuje pierwsze pięć kolumn każdej linii^([^:]*:){5}/home/
dopasowuje każdy wiersz, w którym szósta kolumna zaczyna się od „/ home /”cut -d: -f1
wybiera tylko pierwszą kolumnę danych wejściowych, używając:
jako separatora kolumnźródło
Możesz także użyć
index
do poprawienia dopasowania ciągów podobnychgrep -F
i użyć wartości zwracanej, aby upewnić się, że pasuje do początku łańcuchalub jeśli potrzebne jest wyrażenie regularne, przekaż je jako zmienną środowiskową
źródło
Tylko dla odmiany
Wyjaśnienie
Odmiana, jeśli chcesz być wybredny, jeśli
/home/
chodzi o miejsce znalezieniaźródło