[LINUX] Was tun, wenn die Option -f von grep nicht funktioniert?

Einführung

Wenn Sie grep -f verwenden und es passiert, dass nur **" die Zeile am Ende der Suchzeichenfolge "getroffen wird *** Der Zeilenvorschubcode kann die Ursache sein. → Der Inhalt ist, dass es funktioniert, wenn Sie den Zeilenvorschubcode mit "sed" oder "echo" korrigieren.

(* Für Windows. Vielleicht verhält es sich für Mac anders?)


· Option Grep -f

grep -f [Suchzeichenfolgendatei] [Suchzieldatei]

・ Verwenden Sie die while-Anweisung

while read line do grep "$ line" [Zieldatei suchen] done <[Suchzeichenfolgendatei]

(* In diesem Schreibstil muss die letzte Zeile von ** [Zeichenzeichendatei suchen] ** unterbrochen werden (andernfalls wird nur die letzte Zeile nicht gelesen). Zeilen, die mehrere Bedingungen erfüllen, werden häufig angezeigt. Sei vorsichtig, denn es wird getan.


Was ist los

Wie unten gezeigt, kann bei der Suche nach jeder Zeile in der Datei das Phänomen auftreten, dass nur "die Zeile mit der Suchzeichenfolge am Ende" ausgewählt ist (oder eher passiert ist).

Suchzeichenfolgendatei (Datei.txt)


AAA
BBB

Zieldatei durchsuchen (Test.txt)


AAAxxxxxxxx
xxxxxAAAxxx
xxxxxxxxAAA
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx
xxxCCCxxxxx

Es wird nur die Zeile mit der letzten Suchzeichenfolge ausgewählt


$ grep -f file.txt test.txt
xxxxxxxxAAA
xxxxxxxxBBB

$ while read line
> do
> grep "$line" test.txt
> done < file.txt
xxxxxxxxAAA
xxxxxxxxBBB

Beispiel für eine Problemumgehung

1. sed Befehl

Alles ist in Ordnung. Wenn Sie also sed verwenden, um ** [Suchzeichenfolgendatei] ** neu zu erstellen, funktioniert es gut.

$ sed 's/^//' file.txt > file2.txt
$ grep -f file2.txt test.txt
AAAxxxxxxxx
xxxxxAAAxxx
xxxxxxxxAAA
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx

2. Echo-Befehl

Für die "while" -Anweisung funktioniert auch das erneute Lesen von "$ line" mit "echo".

$ while read line
> do
> grep `echo $line` test.txt
> done < file.txt
AAAxxxxxxxx
xxxxxAAAxxx
xxxxxxxxAAA
xxAAAxxBBBx  ##
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx  ##Erscheint oft, wenn mehrere Bedingungen erfüllt sind

Andere Mittel

Beispiele für andere Konvertierungsmethoden für Zeilenvorschubcodes ・ Konvertierung des Zeilenvorschubcodes

Kommentar

Die Ursache für dieses Verhalten war, dass der Zeilenvorschubcode zwischen Windows und Unix unterschiedlich war. Mit anderen Worten, wenn Sie eine unter Windows erstellte Datei als Suchzeichenfolge verwenden, stört der Teil ** \ r ** die Suche (Suche nach "** Zeichenzeichenfolge + \ r **"). Suchen Sie also am Ende. Es traf nur, wenn es eine Schnur gab. (Wenn Sie den Zeilenumbruch in der zweiten Zeile von ** file.txt ** entfernen, wird "BBB" normal durchsucht. Umgekehrt wird ** test.txt ** "sed". Wenn Sie den Zeilenvorschubcode durch Ausführen von CRLF in LF ändern, wird nichts ausgegeben.)

OS Zeilenvorschubcode 「od -Wie es in "c" aussieht
Unix LF \n
Mac(OSX) LF \n
Mac(OS9) CR \r
Windows CR+LF \r\n

Zitat: Zeilenvorschubcode überprüfen

file.Wenn in der zweiten Zeile (BBB) von txt keine Unterbrechung vorliegt


$ grep -f file.txt test.txt
xxxxxxxxAAA
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx

Zieldatei durchsuchen (Test.Wenn sed in txt ausgeführt wird) (nichts wird ausgegeben)


$ sed 's/^//' test.txt > test2.txt
$ grep -f file.txt test2.txt


Wenn Sie sed oder echo verwenden, wird der Zeilenvorschubcode von ** CRLF (\ r \ n) ** in ** LF (\ n) ** konvertiert, sodass die Suche funktioniert. Werden.

Vor und nach dem sed-Befehl


## ----------------------Vor sed(CRLF)
$ file file.txt
file.txt: ASCII text, with CRLF line terminators

$ od -c file.txt
0000000   A   A   A  \r  \n   B   B   B  \r  \n
0000012

## ----------------------Nach sed(LF)
$ file file2.txt
file2.txt: ASCII text

$ od -c file2.txt
0000000   A   A   A  \n   B   B   B  \n
0000010

Vor und nach dem Echo-Befehl


$ cat hoge.txt
hoge

$ while read line
> do
> echo `echo $line` > hoge2.txt
> done < hoge.txt

## ----------------------vor dem Echo(CRLF)
$ od -c hoge.txt
0000000   h   o   g   e  \r  \n
0000006

## ----------------------Nach dem Echo(LF)
$ od -c hoge2.txt
0000000   h   o   g   e  \n
0000005

Referenz: ・ [Sed] Command (Basic) - Textdatei bearbeiten

Im Fall von Mac wurde CR in das vorherige MacOS übernommen, aber nach MacOSX wird gesagt, dass es das gleiche LF wie Unix-Betriebssystem ist.

[Linux] Zeilenumbrüche konvertieren

Recommended Posts

Was tun, wenn die Option -f von grep nicht funktioniert?
Was tun, wenn Sie keine Dateien mit Indizes sortieren können?
Was tun, wenn Sie pyaudio nicht mit pip #Python installieren können?
Was tun, wenn Sie mit Maven kein Projekt erstellen können?
Was tun, wenn die Pipenv-Shell nicht mehr möglich ist?
Was tun, wenn PDO nicht in Laravel oder CakePHP gefunden wird?
Was tun, wenn Sie nicht mit pip in einer Babun-Umgebung installieren können?
Was tun, wenn Sie mysqlclient nicht per Pip installieren können?
Was tun, wenn Sie sich nicht als root anmelden können?
Was tun, wenn Sie unter Linux kein WLAN verwenden können?
Was tun, wenn bei der Pip-Installation ein Unicode-Dekodierungsfehler auftritt?
Was tun, wenn Sie den Papierkorb in Lubuntu 18.04 nicht verwenden können?
Was tun, wenn Sie mit Python keine E-Mail an Yahoo senden konnten?
Was tun, wenn Sie die Rastersuche von sklearn in Python nicht verwenden können?
Was tun, wenn Sie sich mit FileNotFoundError in der Dateireferenz verlieren?
Was tun, wenn TypeError in min und max von numpy auftritt?
Was tun, wenn Sie URL 443 mit pip nicht abrufen konnten?
Swapon fehlgeschlagen: Was tun, wenn Sie sich über eine Operation ärgern, die nicht zulässig ist?
Was tun, wenn bei der Installation von Python mit pyenv eine Fehlermeldung angezeigt wird?
Kein Modul mit dem Namen Was tun, wenn Sie "libs.resources" erhalten?
ModuleNotFoundError: Kein Modul Was tun, wenn Sie'tensorflow.contrib 'erhalten?
Links, um mit Sublime Text zu tun, was Sie wollen
Was Sie mit hstack oder vstack mit dstack nicht machen können
Was tun, wenn bei der Installation von Python 2 mit pyenv ein OpenSSL-Fehler auftritt?
So installieren und verwenden Sie pyenv. Was tun, wenn Sie die Python-Version nicht wechseln können?
Was tun, wenn beim Importieren von matplotlib mit Jupyter ein Importfehler auftritt?
Was tun, wenn Sie Python auf IntelliJ ausführen und mit einem Fehler beenden?
[AWS] Was tun, wenn Sie mit Lambda pfeifen möchten?
Was tun, wenn Sie von Windows-Zeichencodes abhängig sind?
Was tun, wenn Overalls "Abdeckung unbekannt" werden?
Einfache Lösung, wenn Sie Ihr EC2-Schlüsselpaar verlieren
Was tun, wenn Yum kaputt geht?
Was tun mit der Installation von Magics?
Was tun mit PYTHON Release?
Python | Was Sie mit Python machen können
Was tun, wenn beim Versuch, pip mit pyenv zu verwenden, ein undefinierter Fehler angezeigt wird?
Was tun, wenn in Python minus Null angezeigt wird?
Was tun, wenn Intellisense mit Anaconda + VSCode + Tensorflow2.1 nicht funktioniert?
Was tun, wenn "Ich kann die Site nicht sehen !!!!"
Was Sie mit API Vol.1 tun können
Was Sie mit Programmierkenntnissen machen können
Lassen Sie uns zusammenfassen, was Sie tun möchten.
Was tun, wenn ipython und python mit unterschiedlichen Versionen starten?
Was tun, wenn Sie sich über TensorFlow v2 ohne Attribut 'app' ärgern?
Was tun, wenn Sie während der Anaconda-Installation unter Linux nicht weiterkommen?
Was tun, wenn der Chainer (Windows) -Beispielverzeichnis mit WinError 183 beendet wird?
Was tun, wenn bei der Installation von pyenv kein Fehler auftritt?
Was tun, wenn der Server nicht mit dem Runserver python manage.py startet?
Was tun, wenn beim Importieren von numpy mit VScode ein Fehler auftritt?
Was tun, wenn beim Laden von mnist eine Fehlermeldung angezeigt wird?
Was tun, wenn bei Verwendung von Python mit der NetBeans-IDE die Warnung "Falsche Python-Plattform" angezeigt wird?
Was tun, wenn Sie sich über "Wertefehler: unbekannt lokal: UTF-8" in python manage.py syncdb ärgern?
Was tun, wenn pipreqs zu UnicodeDecodeError führt?
Was tun, wenn mod_fcgid UnicodeEncodeError nicht auflösen kann?
Was tun, wenn die Schienen nicht funktionieren?
Was tun, wenn Scrapy nach der Installation von Scrapy mit Pip auf dem Mac nicht funktioniert?