Jak poprawnie grep do tekstu w skryptach bash
- 3047
- 314
- Tacjana Karpiński
Grep
to wszechstronne narzędzie Linux, które mogą potrwać kilka lat. Nawet doświadczeni inżynierowie Linuksa mogą popełnić błąd, zakładając, że podany plik tekstowy będzie miał określony format. Grep
można również użyć bezpośrednio w połączeniu z Jeśli
Wyszukiwanie oparte na skanowaniu obecności ciągu w danym pliku tekstowym. Odkryj, jak poprawnie grep dla tekstu niezależnie od zestawów znaków, jak korzystać z -Q
opcja do wysyłania SMS -a dla obecności ciągów i więcej!
W tym samouczku się nauczysz:
- Jak wykonać prawidłowe wyszukiwanie tekstu niezależne od zestawu za pomocą GREP
- Jak korzystać z zaawansowanych instrukcji GREP na podstawie poleceń scenariuszy lub terminali OneLiner
- Jak testować obecność ciągu za pomocą
-Q
opcja do GREP - Przykłady podkreślające użycie GREP w tych przypadkach użycia
Zastosowane wymagania i konwencje oprogramowania
Kategoria | Wymagania, konwencje lub wersja oprogramowania |
---|---|
System | Niezależny od rozkładu Linuksa |
Oprogramowanie | Wiersz poleceń Bash, system oparty na Linuksie |
Inny | Wszelkie narzędzie, które nie jest zawarte w skorupce Bash domyślnie można zainstalować za pomocą za pomocą sudo apt-get instal instal narzędzie (Lub Mnij instalacja dla systemów opartych na Redhat) |
Konwencje | # - Wymaga wykonywania Linux -Commands z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda$-Wymaga wykonania Linux-commands jako zwykłego niepewnego użytkownika |
Przykład 1: Prawidłowe wyszukiwanie tekstu niezależne od zestawu znaków za pomocą GREP
Co się dzieje, gdy grep przez plik, który jest oparty na tekście/postaci, ale zawiera znaki specjalne poza normalnym zakresem? Może się to nastąpić, gdy plik zawiera złożone zestawy znaków lub wydaje się zawierać treści podobne do binarnych. Aby to lepiej zrozumieć, najpierw musimy zrozumieć, czym są dane binarne.
Większość (ale nie wszystkie) komputery używa na swoim najbardziej podstawowym poziomie tylko dwa stany: 0 i 1. Być może nad uproszczeniem możesz pomyśleć o tym jak przełącznik: 0 nie jest wolt, bez mocy, a 1 to „pewien poziom napięcia” lub zasilany. Nowoczesne komputery są w stanie przetwarzać miliony tych 0 i 1 w ułamku sekundy. Jest to stan 0/1 nazywa się „bit” i jest systemem liczbowym bazowym-2 (podobnie jak nasz system dziesiętny 0-9 to system liczbowy bazowy-10). Istnieją inne sposoby reprezentowania danych opartych na bitach/binarnych, takich jak ośmiorożca (8-bazowa: 0-7) i szesnastka (16-baza: 0-f).
Wracając do „binarnego” (bin, podwójny), możesz zacząć widzieć, w jaki sposób jest powszechnie używany do opisania dowolnego rodzaju danych, które nie mogą być łatwo rozpoznane przez ludzi, ale mogą być rozumiejące przez komputery binarne. Być może nie jest to najlepsza analogia, ponieważ binarna zwykle odnosi się do dwóch stanów (true/fałsz), podczas gdy wspólnie żargon „Dane binarne” doszło do danych, które nie można łatwo interpretować.
Na przykład zawiera plik kodu źródłowego opracowany z kompilatorem dane binarne W większości nieczytelne przez ludzi. Na przykład zawiera plik kodu źródłowego opracowany z kompilatorem dane binarne głównie nieczytelne przez ludzkie oko. Innym przykładem może być zaszyfrowany plik lub plik konfiguracyjny zapisany w formacie zasadności.
Jak to wygląda, gdy próbujesz przeglądać dane binarne?
Zwykle podczas przeglądania danych binarnych dla elementów wykonywalnych zobaczysz pewne prawdziwe dane binarne (wszystkie dziwne znaki wyglądające - komputer wyświetla dane binarne w ograniczonych możliwościach formatu wyjściowego, które obsługuje Twój terminal), a także niektóre te tekstowe wyjście wyjściowe. W przypadku LS
Jak widać tutaj, wydają się to nazwy funkcji w obrębie LS
kod.
Aby poprawnie wyświetlić dane binarne, naprawdę potrzebujesz przeglądarki plików binarnych. Tacy widzowie po prostu formatują dane w swoim natywnym formacie, wraz z boczną kolumną tekstową. Unika ograniczeń wyjściowych tekstowych i pozwala zobaczyć kod komputerowy tego, czym naprawdę jest: 0 i 1, choć często sformatowane w formatowaniu szesnastkowym (0-f lub 0-F, jak pokazano poniżej).
Rzućmy okiem na dwa zestawy 4 wierszy kodu binarnego LS
Aby zobaczyć, jak to wygląda:
$ hexdump -c /bin /ls | głowa -n4; Echo '… '; hexdump -c /bin /ls | ogon -n131 | głowa -n4 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.Elf… | 00000010 03 00 3E 00 01 00 00 00 D0 67 00 00 00 00 00 |…>… G… | 00000020 40 00 00 00 00 00 00 00 C0 23 02 00 00 00 00 00 |@… #… | 00000030 00 00 00 40 00 38 00 0D 00 40 00 1E 00 1D 00 |… @.8… @… |… 00022300 75 2e 76 65 72 73 69 6f 6e 00 2e 67 6e 75 2e 76 | U.Wersja… GNU.V | 00022310 65 72 73 69 6F 6E 5F 72 00 2E 72 65 6C 61 2E 64 | ERSION_R… RELA.D | 00022320 79 6e 00 2e 72 65 6c 61 2e 70 6c 74 00 2e 69 6e | yn… rela.plt… in | 00022330 69 74 00 2E 70 6C 74 2E 67 6F 74 00 2E 70 6C 74 | IT… PLT.Got… Plt |
Jak to wszystko (oprócz dowiedzenia się więcej o działaniu komputerów) pomaga zrozumieć poprawne Grep
stosowanie? Wróćmy do naszego pierwotnego pytania: co się stanie, gdy GREP przez plik, który jest oparty na tekstie/postaci, ale zawiera znaki specjalne poza normalnym zakresem?
Możemy teraz słusznie przekształcić to do „Co się stanie, gdy GREP za pomocą pliku binarnego”? Twoja pierwsza reakcja może być: Dlaczego miałbym chcieć przeszukać plik binarny?. Po części odpowiedź pokazuje w powyższym LS
przykład już; Często pliki binarne nadal zawierają struny tekstowe.
I istnieje znacznie ważniejszy i główny powód; Grep
Domyślnie przyjmie wiele plików, które zawierają dane binarne, gdy tylko mają w nich znaki specjalne, a być może gdy zawierają one pewne binarne sekwencje ucieczki, nawet jeśli sam plik może być oparty na danych. Co gorsza, domyślnie GREP zawiedzie i przerywa skanowanie tych plików, gdy tylko takie dane zostaną znalezione:
$ head -n2 test_data.SQL Utwórz tabelę T1 (ID int); Wstaw do wartości T1 (1); $ grep „wstaw” test_data.SQL | ogon -n2 wstaw do wartości T1 (1000); Plik binarny test_data.dopasowania SQL
Jako dwa wybitne przykłady z osobistego doświadczenia w bazie danych, kiedy skanujesz dzienniki błędów serwera bazy danych, które mogą łatwo zawierać takie znaki specjalne, jak czasami komunikat o błędach, baza danych, tabela i nazwy pola mogą dotrzeć do dziennika błędów, a takie komunikaty są regularnie W zestawach znaków specyficznych dla regionu.
Innym przykładem jest test SQL uzyskany z apartamentów testowych bazy danych (pokazano w powyższym przykładzie). Takie dane często zawierają znaki specjalne do testowania i podkreślenia serwera na wiele sposobów. To samo dotyczy większości danych testowych i innych zestawów danych testowania domeny. Ponieważ GREP domyślnie zawodzi w stosunku do takich danych, ważne jest, aby zapewnić opcję GREP, aby to pokryć.
Opcja jest --Fiły binarne = tekst
. Widzimy, jak teraz działa nasz GREP poprawnie:
$ grep „wstaw” test_data.SQL | WC -L 7671 $ grep „wstaw” test_data.SQL | Ogon -n1 plik binarny test_data.SQL dopasowuje $ grep--binary-files = tekst „wstaw” test_data.SQL | WC -L 690427
Co za różnica! Możesz sobie wyobrazić, ile zautomatyzowanych Grep
Skrypty na całym świecie nie skanują wszystkich danych, które powinni skanować. To, co jest gorsze i znacząco łączy problem Grep
Upadnie w 100% w milczeniu, gdy to się stanie, kod błędu wyniesie 0 (sukces) w obu przypadkach:
$ grep -q „wstaw” test_data.SQL; Echo $? 0 $ grep - -binary -files = text -q 'wstaw „test_data.SQL; Echo $? 0
Jeszcze bardziej to komunikat o błędzie jest wyświetlany Stdout
wyjście, a nie włączone Stderr
Jak można się spodziewać. Możemy to zweryfikować poprzez przekierowanie Stderr
do urządzenia zerowego /dev/null
, tylko wyświetlanie Stdout
wyjście. Wyjście pozostaje:
$ grep „wstaw” test_data.SQL 2>/dev/null | Ogon -n1 plik binarny test_data.dopasowania SQL
Oznacza to również, że jeśli chcesz przekierować wyniki GREP do innego pliku (> jakiś plik.tekst
po poleceniu GREP), że „plik binarny… dopasuje się” byłoby teraz częścią tego pliku, oprócz braku wszystkich wpisów widocznych po wystąpieniu takiego problemu.
Kolejnym problemem jest aspekt bezpieczeństwa: weźmy organizację, która ma scenariusz GREP z dziennikiem dostępu do raportów e -mail do Sysadminów, ilekroć nieuczciwy agent (jak haker) próbuje i uzyska dostęp do nieautoryzowanych zasobów. Jeśli taki haker jest w stanie wstawić niektóre dane binarne do dziennika dostępu przed próbą dostępu, a GREP jest niezabezpieczony --Fiły binarne = tekst
, Żadne takie e -maile nigdy nie zostaną wysłane.
Nawet jeśli skrypt jest wystarczająco dobrze opracowany, aby sprawdzić Grep
Kod wyjściowy, wciąż nikt nigdy nie zauważy błędu skryptu, ponieważ GREP zwraca 0
, lub innymi słowy: sukces. Sukces to nie jest 🙂
Istnieją dwa łatwe rozwiązania; dodać --Fiły binarne = tekst
Do wszystkich twoich Grep
Oświadczenia i możesz rozważyć skanowanie wyjścia GREP (lub zawartości przekierowanego pliku wyjściowego) dla pliku binarnego wyrażenia regularnego.*mecze'. Aby uzyskać więcej informacji na temat wyrażeń regularnych, zobacz Bash Regexps dla początkujących z przykładami i zaawansowaną regex Bash z przykładami. Jednak albo wykonywanie obu lub tylko pierwszego byłoby preferowane, ponieważ druga opcja nie jest odporna na przyszłość; tekst „plik binarny… dopasowuje” może się ulec zmianie.
Na koniec zauważ, że gdy plik tekstowy zostanie uszkodzony (awaria dysku, awaria sieci itp.), treści może być częściowo tekstem i częściowo. To kolejny powód, aby zawsze chronić twoje Grep
stwierdzenia z --Fiły binarne = tekst
opcja.
Tl; Dr: Używać --Fiły binarne = tekst
dla wszystkich twoich Grep
oświadczenia, nawet jeśli obecnie działają dobrze. Nigdy nie wiadomo, kiedy te dane binarne mogą trafić na plik.
Przykład 2: Test obecności danego ciągu w pliku tekstowym
Możemy użyć grep -q
w połączeniu z Jeśli
Instrukcja, aby przetestować obecność danego ciągu w pliku tekstowym:
$ if grep - -binary -files = tekst -qi „wstaw” test_data.SQL; Potem Echo „Znaleziono!„; else echo” nie znaleziono!"; Fi znalazł!
Podzielmy to trochę, najpierw sprawdzając, czy dane naprawdę istnieją:
$ grep - -binary -files = tekst -i „wstaw” test_data.SQL | głowa -n1 wstaw do wartości T1 (1);
Tutaj upuściliśmy Q
(cicho) Opcja uzyskania wyjścia i zobaczenia, że ciąg „wstaw” - pobierany w sposób bezsensowny (określając -I
opcja Grep
istnieje w pliku jako „wstaw…”.
Zauważ, że Q
opcja nie jest konkretnie Testowanie opcja. Jest to raczej modyfikator wyjściowy, który mówi Grep
być „cichym”, ja.mi. Nic nie. Jak więc Jeśli
Oświadczenie wiedz, czy w pliku tekstowym istnieje dany ciąg? Odbywa się to przez Grep
Kod wyjściowy:
$ grep - -binary -files = tekst -i „wstaw” test_data.sql 2> i 1>/dev/null; Echo $? 0 $ grep - -binary -files = tekst -i "to naprawdę nie istnieje" test_data.sql 2> i 1>/dev/null; Echo $? 1
Tutaj zrobiliśmy ręczne przekierowanie wszystkich Stderr
I sdTout
wyjście do /dev/null
przez przekierowanie Stderr
(2>
) Do Stdout
(I 1) i przekierowanie wszystkich Stdout
wyjście do urządzenia zerowego (>/dev/null
). Jest to zasadniczo równoważne -Q
(cicho) opcja do grepa.
Następnie zweryfikowaliśmy kod wyjściowy i ustaliliśmy, że po znalezieniu ciągu, 0
(sukces) jest zwracany, podczas gdy 1
(awaria) jest zwracany, gdy ciąg nie zostanie znaleziony. Jeśli
może użyć tych dwóch kodów wyjściowych do wykonania albo Następnie
albo w przeciwnym razie
określone do niego klauzule.
Podsumowując, możemy użyć Jeśli grep -q
Aby przetestować obecność określonego ciągu w pliku tekstowym. W pełni poprawna składnia, jak pokazano wcześniej w tym artykule, jest Jeśli grep - -binarne -files = text -qi „Search_term” your_file.SQL
w przypadku wyszukiwań wrażliwych na sprawę i Jeśli grep - -binarne -files = text -q "search_term" your_file.SQL
W celu wyszukiwania wrażliwych na sprawę.
Wniosek
W tym artykule widzieliśmy wiele powodów, dla których ważne jest użycie --Fiły binarne = tekst
Podczas prawie wszystkich wyszukiwań GREP. Badaliśmy również za pomocą grep -q
w połączeniu z Jeśli
stwierdzenia do przetestowania obecności danego ciągu w pliku tekstowym. Ciesz się używaniem Grep
, i zostaw nam komentarz ze swoim największym Grep
odkrycia!
Powiązane samouczki Linux:
- Rzeczy do zainstalowania na Ubuntu 20.04
- Obsługa danych wejściowych użytkownika w skryptach Bash
- Mastering Bash Script Loops
- Jak znaleźć ciąg lub tekst w pliku w Linux
- Użyj WPSCAN, aby skanować WordPress w poszukiwaniu luk w kali
- Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
- Jak pobrać informacje o sprzęcie za pomocą DmideCode w Linux
- Zagnieżdżone pętle w skryptach Bash
- Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux