I “m” az Ubuntun, és beírtam a következőt: cat .bash_history | grep git
, és ez visszaállt
A bináris fájl (standard bemenet) egyezik
Az én bash_history
létezik, és sok sor van benne ami git
-vel kezdődik.
Mi okozta ezt a hibát és hogyan tudom kijavítani? class = “comments”>
file .bash_history
(file ~/.bash_history
) kimenete? .bash_history: data
Válasz
Presuma A .bash_history
fájl nem szöveges adatokkal kezdődik, ezért grep
binárisként kezeli a fájlt. Ezt megerősíti a file .bash_history
kimenet:
.bash_history: data
Az elejétől kezdve néhány bájtot olvashat, hogy megfelelő legyen nézet:
head -c1K .bash_history
Itt olvasok először 1 KiB-t.
Az STDOUT-ot átcsaphatja a hexdump
/ od
vagy hasonló.
Mellékesen: grep
fájlnév ( s) érvként, tehát itt cat
haszontalan; próbáld ki ezt:
grep git .bash_history
Megjegyzések
Válasz
Használhatja a grep -a "pattern"
parancsot.
a man grep oldalról:
-a, –text
Feldolgozzon egy bináris fájlt, mintha szöveg lenne; ez egyenértékű a –binary-files = text beállítással.
Megjegyzések
- Ez segített abban, hogy a
-z
zászlót több soron egyeztessem. - Nekem bevált, de mégis furcsa, mert a fájlom nem ' ta bináris fájl. [grid @ serverdg2 nyomkövetés] $ fájl listener.log listener.log: adatok
Válasz
ugyanaz a probléma, amikor meg akarom markolni a .bash_history
fájlt. (Kis megjegyzés: Átneveztem az előzményeket, így létrejött egy új. Ezt az új előzményeket nem kezelték binárisként.)
A @heemayls válaszban az szerepel, hogy grep
fájlneveket vesz fel, és cat
haszontalan lenne. Ez nem teljesen igaz. grep
s man oldalról:
Ha nincs megadva fájl, vagy ha a „-” fájl adott, a grep a szokásos bemenetet keresi.
Tehát használhatja a cat
fájlt, és csatolhatja a következőhöz: grep
. Ez azonban nem oldja meg azt a problémát, hogy a .bash_history
-t binárisként kezeljük. Az egyetlen helyes dolog az, ha grep -a
-t használ (mint például az @AK_ válaszában), hogy grep
az előzményeket közvetlenül használja, vagy a cat
és egy pipa.
cat .bash_history | grep -a git
vagy
grep -a git .bash_history
Válasz
A hiba az oka, hogy a fájl adatai binárisak, a string parancs segítségével használhatja az ember által olvashatót (azaz strings
) rész, amelyet általában a grep
strings data | grep -i whatever
Megjegyzések
- Ez nem foglalkozik a kérdés első részével, azaz " mi okozza a probléma ".
Válasz
Ezt okozhatja null bájttal a bash történelmében. A null karakterű sorok eltávolítása megoldhatja a problémát. A grep “Perl-regexp módjával ellenőrizheti őket:
grep -Pa "\x00" .bash_history
Ez a bejegyzés javaslatai vannak a nem unix rendszerekre.
grep -a git .bash_history
kimenete?-a
?-a
teszigrep
hogy a fájlt binárisként kezelje.-a
hogygrep
bináris fájlt dolgozzon fel, mintha szöveg lenne.