Gibt es eine Möglichkeit, PDF-Dateien mit der Kraft von grep zu durchsuchen, ohne zuerst in Ubuntu in Text zu konvertieren?

Kommentare

Antwort

Installieren Sie das Paket pdfgrep und verwenden Sie dann den folgenden Befehl:

find /path -iname "*.pdf" -exec pdfgrep pattern {} + 

—— ————

Einfachste Möglichkeit, dies zu tun:

pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf 

Kommentare

    ies funktioniert auch in Mac OSX (Mavericks). Installieren Sie es mit Brew. Einfach. Danke.

  • Aus Neugier habe ich die Quelle von pdfgrep überprüft und es verwendet Poppler, um Zeichenfolgen aus dem PDF zu extrahieren. Fast genau wie die Antwort von @wag ‚ nur seitenweise und nicht vermutlich das gesamte Dokument.
  • pdfgrep auch hat ein rekursives Flag. Diese Antwort könnte also möglicherweise auf Folgendes reduziert werden: pdfgrep -R pattern /path/. Es ist jedoch möglicherweise weniger effektiv, wenn jede Datei durchsucht wird, auch wenn es sich nicht um eine PDF-Datei ‚ handelt. Und ich stelle fest, dass es Probleme mit internationalen Zeichen wie å, ä und ö gibt .
  • Tatsächlich ist die Option -n ein Profi für pdfgrep, da sie es ermöglicht, die Seitenzahl in die Ausgabe aufzunehmen (kann für die weitere Verarbeitung hilfreich sein).
  • Diese Antwort wäre einfacher zu verwenden, wenn erklärt würde, welche Bits des Befehls wörtlich kopiert werden sollen und welche Platzhalter sind. Was ist ‚ s pattern? Was ist ‚ s {}? Was ‚ ist mit dem `+` los? Ich habe beim ersten Lesen keine Ahnung … also gehe ich zur Manpage, nehme ich an.

Antwort

Wenn Sie poppler-utils installiert haben (Standard unter Ubuntu Desktop), können Sie es im laufenden Betrieb „konvertieren“ und in grep weiterleiten :

pdftotext my.pdf - | grep "pattern" 

Dadurch wird keine TXT-Datei erstellt.

Kommentare

  • also .. Sie extrahieren den Text, bevor Sie ihn erfassen, was bedeutet, dass die Antwort “ no “ lautet.
  • @akira Das OP bedeutete wahrscheinlich „, ohne das PDF in einem Viewer zu öffnen und in Text zu exportieren “
  • @akira Wo sehen Sie “ nur grep „?
  • @akira Nun, ich habe bereits gesagt, was ich denke er meinte wahrscheinlich, er möchte ‚ nicht in Text exportieren, bevor er verarbeitet wird. Ich bezweifle sehr, dass er ein Problem mit einem Befehl hat, der co wandelt sich in irgendeiner Weise in Text um; ‚ gibt es keinen Grund,
  • @sherrellbc nicht zu verwenden. Das zweite Argument von pdftotext ist der Dateiname, in den geschrieben werden soll . Konventionell können Sie mit Tools jedoch normalerweise in stdout anstatt in eine Datei schreiben, indem Sie stattdessen - angeben. In ähnlicher Weise würden einige Tools standardmäßig in stdout schreiben, wenn Sie ein solches Argument vollständig weglassen (dies ist jedoch nicht immer möglich, ohne Mehrdeutigkeiten zu erzeugen).

Antwort

pdfgrep wurde genau für diesen Zweck geschrieben und ist in Ubuntu verfügbar.

Es versucht, größtenteils mit grep kompatibel zu sein und bietet somit „die Kraft von grep“, das nur auf PDFs spezialisiert ist. Dazu gehören allgemeine Grep-Optionen wie --recursive, --ignore-case oder --color. P. >

Im Gegensatz zu pdftotext | grep kann pdfgrep die Seitenzahl einer Übereinstimmung performant ausgeben und ist im Allgemeinen schneller, wenn nicht das gesamte Dokument durchsucht werden muss (z --max-count oder --quiet).

Die grundlegende Verwendung lautet:

pdfgrep PATTERN FILE.. 

wobei PATTERN Ihre Suchzeichenfolge und FILE eine Liste von Dateinamen (oder Platzhaltern in einer Shell) ist.

Weitere Informationen finden Sie in der Manpage .

Antwort

Nein.

Ein PDF besteht aus Datenblöcken, von denen einige Text, einige Bilder und einige wirklich magische XYZ-Dateien (z. B. .u3d-Dateien) sind Chunks werden meistens komprimiert (z. B. flach, überprüfen Sie http://www.verypdf.com/pdfinfoeditor/compression.htm ). Um „grep“ a . pdf Sie müssen die Komprimierung umkehren oder den Text extrahieren.

Sie können dies entweder pro Datei mit Tools wie pdf2text tun und das Ergebnis erfassen, oder Sie führen einen „Indexer“ aus (siehe xapian.org oder lucene ), das einen durchsuchbaren Index aus Ihren PDF-Dateien erstellt, und dann können Sie den verwenden Suchmaschinen-Tools dieses Indexers, um den Inhalt des PDFs zu erhalten.

Aber nein, Sie können keine grep PDF-Dateien erstellen und auf zuverlässige Antworten hoffen, ohne den Text zu extrahieren zuerst.

Kommentare

  • Wenn man bedenkt, dass pdfgrep existiert (siehe oben), gibt es eine flache “ no “ ist falsch.
  • @JonathanCross, wenn man bedenkt, dass die Frage “ lautet Verwenden der Leistung von grep, ohne zuerst in Text zu konvertieren „, eine flache “ no “ ist korrekt.

Antwort

Recoll kann PDFs durchsuchen. Es unterstützt keine regulären Ausdrücke, verfügt jedoch über viele andere Suchoptionen, sodass es möglicherweise Ihren Anforderungen entspricht.

Antwort

Es gibt eine doppelte Frage zu StackOverflow. Die Leute dort schlagen eine Variation der Antwort von harish.venkarts vor:

find /path -name "*.pdf" -exec sh -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"" \; 

Der Vorteil gegenüber der ähnlichen Antwort hier ist die --with-filename -Flag für grep. Dies ist auch pdfgrep etwas überlegen, da das Standard-grep mehr Funktionen bietet.

https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files

Kommentare

  • Ich denke, es wäre besser gewesen, dies zu belassen als Kommentar (oder Bearbeitung) in der ähnlichen Antwort, auf die Sie sich beziehen.

Antwort

Schauen Sie sich das an im allgemeinen Ressourcen-Grep-Tool crgrep , das die Suche in PDF-Dateien unterstützt.

Es ermöglicht auch die Suche nach anderen Ressourcen wie in Archiven oder Datenbanken verschachtelten Inhalten Tabellen , Bild-Metadaten, POM-Dateiabhängigkeiten und Webressourcen – und Kombinationen davon einschließlich rekursiver Suche.

Antwort

Sie könnten Leiten Sie es zuerst durch strings: –

cat file.pdf | strings | grep <...etc...> 

Kommentare

  • Verwenden Sie einfach strings file.pdf | grep <...>, Sie ‚ benötigen cat
  • nicht

  • Ja – mein Verstand scheint besser mit Streams zu funktionieren … 🙂
  • funktioniert nicht, wenn Text komprimiert wird, was meistens der Fall ist.
  • Auch wenn Der Text ist unkomprimiert. ‚ besteht im Allgemeinen aus kleinen Satzteilen (nicht unbedingt ganze Wörter!), die fein mit Formatierungsinformationen vermischt sind. Nicht sehr freundlich für strings oder grep.
  • Können Sie sich einen anderen Grund vorstellen, warum die Verwendung von Zeichenfolgen dafür nicht ‚ funktioniert nicht? Ich habe festgestellt, dass die Verwendung von Zeichenfolgen bei einigen PDFs funktioniert, bei anderen jedoch nicht.

Antwort

Versuchen Sie dies

find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \ pdftotext "$i" - | grep pattern; done 

zum Drucken der Zeilen, in denen das Muster im PDF-Format vorkommt

Antwort

Hier ist ein schnelles Skript für die PDF-Suche im aktuellen Verzeichnis:

#!/bin/bash if [ $# -ne 1 ]; then echo "usage $0 VALUE" 1>&2 exit 1 fi echo "SEARCH IS CASE SENSITIVE" 1>&2 find . -name "*.pdf" -exec /bin/bash -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"" "$1" \; 

Kommentare

  • Ich kann dies nicht bearbeiten, da es zu wenig ist: Die $1 im Suchaufruf sollte in Anführungszeichen gesetzt werden, da dies sonst ‚ nicht mit der Suche funktioniert Begriffe mit Leerzeichen.
  • @ankon hat es behoben 🙂

Antwort

CD an Ihr Ordner enthält Ihre PDF-Datei und dann ..

pdfgrep "pattern" your.pdf 

oder wenn Sie in mehr als nur einer PDF-Datei suchen möchten (z. B. in allen PDF- Dateien in Ihrem Ordner)

pdfgrep "pattern" `ls *.pdf` 

oder

pdfgrep "pattern" $(ls *.pdf) 

Kommentare

  • warum Verwenden Sie ls, um Dateinamen in Parameter einzufügen? ‚ ist nicht nur langsamer, sondern auch eine schlechte Idee, die Ausgabe ls als zu verwenden die Eingabe in andere Befehle . Nur pdfgrep 'pattern' *.pdf ist genug
  • @phuclv Sie liegen falsch. pdfgrep 'pattern' *.pdf funktioniert nicht.
  • @ f0nzie Sie ‚ liegen falsch. $(ls *.pdf) ist fast genau dasselbe wie *.pdf, nur schlimmer, weil speziell Dateien sind nicht in Anführungszeichen geschützt.

Antwort

Ich nehme an, Sie meinen, Sie müssen es nicht auf der Festplatte konvertieren kann sie in stdout konvertieren und dann mit pdftotext erfassen. Das PDF ohne jegliche Konvertierung zu durchsuchen, ist kein praktischer Ansatz, da PDF meist ein Binärformat ist.

Im Verzeichnis:

ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword" 

oder im Verzeichnis und seinen Unterverzeichnissen:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword" 

Auch weil einige pdf Scans sind, müssen sie zuerst OCRed werden. Ich habe eine ziemlich einfache Methode geschrieben, um alle PDFs zu durchsuchen, die nicht grep bearbeitet und OCR-fähig sind.

Ich habe festgestellt, ob eine pdf hat keine Schriftart und kann normalerweise nicht durchsucht werden. Wenn wir dies wissen, können wir pdffonts verwenden.

Die ersten beiden Zeilen der pdffonts sind die Tabellenüberschriften. Wenn eine Datei durchsuchbar ist, werden mehr als zwei Zeilen ausgegeben. In diesem Wissen können wir Folgendes erstellen:

gedit check_pdf_searchable.sh 

füge dann dieses ein

#!/bin/bash #set -vx if ((`pdffonts "$1" | wc -l` < 3 )); then echo $1 pypdfocr "$1" fi 

und mache es dann ausführbar

chmod +x check_pdf_searchable.sh 

und liste dann alle auf Nicht durchsuchbare PDFs im Verzeichnis:

ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {} 

oder im Verzeichnis und seinen Unterverzeichnissen:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {} 

Antwort

Wenn Sie nur nach PDF-Namen / -Eigenschaften suchen möchten … oder nach einfachen Zeichenfolgen, die nicht komprimiert oder codiert sind, dann statt strings Sie können Folgendes verwenden:

grep -a STRING file.pdf cat -v file.pdf | grep STRING 

Von grep --help:

 --binary-files=TYPE assume that binary files are TYPE; TYPE is "binary", "text", or "without-match" -a, --text equivalent to --binary-files=text 

und cat --help:

 -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB 

Antwort

gpdf ist möglicherweise das, was Sie benötigen, wenn Sie Gnome verwenden ! Überprüfen Sie dies , falls Sie Gnome nicht verwenden. Es enthält eine Liste der CLI-PDF-Viewer. Dann können Sie grep verwenden, um ein Muster zu finden.

Antwort

 pdfgrep -r --include "*.pdf" -i "pattern"  

Kommentare

  • Willkommen auf der Website und vielen Dank Sie für Ihren Beitrag. Können Sie erklären, was diese Optionen bedeuten? Dies könnte auch dazu beitragen, zu erklären, wie sich Ihr Ansatz von anderen Antworten auf diese Frage unterscheidet, die ebenfalls pdfgrep empfehlen.

Antwort

Der schnellste Weg ist

grep -rinw "pattern" --include \*.pdf * 

Kommentare

  • Willkommen auf der Website. Würde es Ihnen etwas ausmachen, Ihrer vorgeschlagenen Lösung weitere Erklärungen hinzuzufügen, um sie für Nichtfachleute zugänglicher zu machen? Beispielsweise sucht Ihre grep -Befehlszeile rekursiv in Unterverzeichnissen, von denen jemand, der nicht mit grep vertraut ist, möglicherweise nichts weiß. Außerdem haben Sie das Flag -i eingefügt, obwohl das Ignorieren des Falls möglicherweise nicht immer das ist, was der Benutzer wünscht. Erklären Sie außerdem, inwiefern sich Ihr Ansatz von der Antwort von z. @phuclv und andere.
  • Wie AdminBee sagt, erfordert die Frage keine Suche ohne Berücksichtigung der Groß- und Kleinschreibung oder rekursive Verzeichnissuche. Die Optionen -n und -w sind ebenfalls nicht durch die Frage gerechtfertigt. Noch wichtiger ist jedoch, dass in dieser Antwort beschrieben wird, wie Textdateien durchsucht werden, deren Namen mit .pdf enden. Sie haben den Punkt der Frage verpasst.

Antwort

less mypdf.pdf | grep "Hello, World" 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.