Załóżmy, że istnieje takie polecenie, jak:
cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG
Dane wyjściowe są takie:
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
Moje pytanie brzmi: czy są jakieś polecenia, które wypisują tylko to, co jest w przecinku, tzn. " "
?
Czy mógłbyś trochę wyjaśnić polecenie? Dziękuję Ci! z góry.
command-line
text-processing
Raphael
źródło
źródło
cat
w potoku jest prawie zawsze marnotrawstwem zasobów (AKA UUOC );grep
potrafi już odczytać dane wejściowe z pliku (tzn.grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic
robi dokładnie to samo, ale 1. Jest krótszy 2. Łatwiej zrozumieć 3. Nie rozwidla dodatkowej powłoki i dodatkowego procesu). W 99% przypadków użycie cat na początku potoku bez łączenia wielu plików jest po prostu szkodliwe. :)cat
, choć w tym przypadku bezużyteczne, stałaby edycji całą linię poleceń łatwiejszych w przyszłości w przypadku, gdy chcesz zmienić / dodać / usunąć coś później, możetr
albocut
, etc, nie trzeba znaleźć i przenieść pliku , upewnij się, że drugie polecenie go obsługuje, znajdź, gdzie go umieścić itp. A w przypadku małego pliku testowego dodaje tylko 0,002 s. (Prawdopodobnie spędziłem więcej czasu na pisaniu tego, niż kiedykolwiek zaoszczędzę w ciągu całego życia, unikając zbędnychcat
)cat
pomoc tutaj? Możesz to zrobićgrep foo file | tr
lub... | cut
tak łatwo, jakcat file | tr | grep ...
. Pocat
prostu dodaje dodatkowe pięć znaków, dodatkowy potok i dodatkowe wywołanie programu i niczego nie upraszcza.Odpowiedzi:
Tak, możesz to zrobić. Twoje polecenie będzie:
które zwróci tylko:
awk
Komenda używa separatory pól z-F
polecenia i ustawić go użyć cudzysłowia, wpisz ją w z pojedynczych cytatów wokół niego jak-F'"'
. Następnie'{print $2}'
mówi awk, aby wydrukował drugi zestaw po separatorze pól.Mam nadzieję że to pomoże!
źródło
cat
igrep
. Możesz wymienićcat
igrep
rozdzielićawk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic
. Mniej hydrauliki, pozwalając AWK wykonać całą pracę, którą jest więcej niż w stanie wykonaćawk
polecenie. =)Możesz to zrobić za pomocą jednego
grep
polecenia:Lub (nieco dłużej i bardziej przekonująco):
-P
: każegrep
interpretować wzorzec jako PCRE (wyrażenie regularne zgodne z Perl);-o
: mówi,grep
aby wydrukować tylko dopasowanie;^CONFIG_ARCH_DEFCONFIG="
: dopasowujeCONFIG_ARCH_DEFCONFIG="
ciąg na początku linii;\K
: odrzuca poprzednio dopasowany podciąg;# 1:
[^"]*
: dopasowuje dowolną liczbę dowolnych znaków nie"
(łapczywie).# 2:
.*?
: dopasowuje dowolną liczbę dowolnych znaków (leniwie);(?=")
: lookahead (asercja zerowa, nie pasuje do żadnego znaku); pasuje, jeśli następujący znak to"
.źródło
Jest wiele sposobów na skórowanie tego kota, oto
sed
sposób:Tutaj dopasowujemy linię i przechwytujemy pożądaną część, tj. Część w podwójnych cudzysłowach (
([^"]+)
), a następnie zastępujemy całą linię tylko przechwyconą grupą (\1
).Przykład:
źródło
Co nie
perl
?perl
Będzie-p
rukuj każdy wiersz po zastosowaniu skryptu podane przez-e
.s/foo/bar/
Zastąpifoo
zbar
. Wzorce w nawiasach są „zrobione” i może być dalej$1
,$2
...$N
gdzie$1
jest 1 wzór niewoli,$2
drugi itp wyrażenie regularne będzie patrzeć na wszystko, aż pierwszy cytat (.*?"
), a następnie uchwycić 0 lub więcej innych niż"
znaki ([^"]*
) i wszystko inne. Całość zastąpiono przechwyconym wzorem.Możesz także pozostawić pasujący wzór do
perl
:źródło
with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]
Oto kombinacja
grep
icut
, który wykonuje tę samą pracę.Wyjaśnienie:
grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic
Jest to część, która znajduje się linii w standardzie składni grep:grep [OPTIONS] PATTERN [FILE...]
. Wyjście przechodzi przez potok do następnego etapucut -d"\"" -f2
. W tej części zastosowano wycięcie do przycięcia tekstu oddzielonego określonym separatorem (który jest oznaczony-d
flagą). Musimy uciec od podwójnego cudzysłowu odwrotnym ukośnikiem, aby powłoka pozwalała na przyjmowanie podwójnego cudzysłowu jako jednej z opcjicut
polecenia, zamiast wprowadzania danych do samej powłoki. Terazcut
będzie traktować wyjście zgrep
jako oddzielone"
i podzielone na trzy kolumny,CONFIG_ARCH_DEFCONFIG
,arch/x86/configs/x86_64_defconfig
i pustej przestrzeni. Linia, której potrzebujemy, to druga kolumna, co oznacza, że musimy użyć-f2
flagi.źródło
Ponieważ obecnie uczę się
python
tutaj, jest wersja korzystająca właśnie z tego.Przykładowy przebieg:
źródło
line.startswith
Ponieważre.match
jest znacznie wolniejszy niżstartswith