Jak poprawnie grep do tekstu w skryptach bash

Jak poprawnie grep do tekstu w skryptach bash

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
Jak poprawnie grep do tekstu w skryptach bash

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
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