Wie drucke ich die erste Zeile mit dem Befehl grep?

16

Ich habe eine Datei namens file.txt. Wie kann ich die erste Zeile nur mit dem grepBefehl drucken ?

Nithin Santhosh
quelle
4
Würde head -1 file.txtnicht funktionieren
Clk
@steeldriver Sie müssen eine Antwort erstellen, da dies der Weg ist, dies mit grep, einem seltsam ausgewählten Tool für den Job, zu tun.
MelBurslan
1
grepist nicht das beste Werkzeug zum Drucken der ersten Zeile einer Datei. Wenn Sie einfach gemeint haben, dass Sie die erste übereinstimmende Zeile drucken möchten grep, oder wenn Sie einen bestimmten Verwendungszweck haben grep, teilen Sie uns dies bitte mit. Wenn wir mehr Kontext hätten, könnten wir vielleicht eine Antwort geben, die Ihnen und der Community besser helfen würde.
DKing
@ MelBurslan In file.txt habe ich zum Beispiel drei Zeilen: Dies ist eine neue Datei. Zweite Zeile: Der Name der Datei ist newFile Dritte Zeile: Ich habe die neue Zeile nicht erstellt. Wie kann ich mit dem Befehl grep nur die erste Zeile drucken? Wie kann ich mit welchem ​​Befehl die erste und die letzte Zeile drucken? Könnt ihr mir bitte die Befehle für beide Fragen mitteilen?
Nithin Santhosh
Wenn eine der vorhandenen Antworten Ihr Problem löst, akzeptieren Sie diese bitte über das Häkchen. Vielen Dank!
Jeff Schaller

Antworten:

36

Obwohl es sich um eine unkonventionelle Anwendung von grep handelt, können Sie sie mit verwenden

grep -m1 "" file.txt

Es funktioniert, weil der leere Ausdruck mit irgendetwas übereinstimmt, während -m1grep nach der ersten Übereinstimmung beendet wird

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.
Stahlfahrer
quelle
+1 für den Beweis, dass mit Schokolade überzogene Bananen hier nicht so nutzlos sind, wie ich dachte.
Kamil Maciorowski
4
Das könnte auf einigen Systemen funktionieren, ist aber nicht portabel:grep: unknown option -- m
Kusalananda
1
Beachten Sie den Unterschied zwischen "Erste Zeile" und "Erste Zeile abgestimmt"
Charles
13

Das ist etwas, was nicht grepgeht. Der Name "grep" selbst ist ein Akronym für " global nach regulären Ausdrücken suchen und drucken", wie es der edBefehl g/re/ptut (für einen bestimmten regulären Ausdruck re).

edist ein interaktiver Zeileneditor aus dem Jahr 1969, der jedoch höchstwahrscheinlich heute auf Ihrem System installiert ist. Wir haben grepvon ed, und es kann als eine Abkürzung oder ein Alias ​​für eine bestimmte Funktionalität von edund gesehen werden sed, die "stream- ed" ist, dh ein (nicht interaktiver) Stream-Editor.

Verwenden wir sedstattdessen:

$ sed -n '1p' file.txt

Die 1pZeichenfolge ist ein winziges sed"Skript", pdas die Zeile ausgibt ( ), die der angegebenen Adresse ( 1, der ersten Zeile) entspricht. Der Editierbefehl 1pwürde edübrigens (keine Überraschung) das Gleiche im Editor tun .

Das -nunterdrückt die Ausgabe von irgendetwas, das nicht explizit vom Skript gedruckt wird, so dass wir nur die erste Zeile der Datei erhalten file.txt.

Alternative:

$ sed '1q' file.txt

Dies druckt alle Zeilen der Datei, beendet ( q) jedoch in Zeile 1 (nach dem Drucken). Das ist genau gleichbedeutend mit head -n 1 file.txt.

Im POSIX-Standard heißt es (verallgemeinernd), dass head -n Nes ungefähr so ​​ist wie sed 'Nq'"jede Zeile drucken, aber in der Zeile beenden N". Der Grund, headder überhaupt in den Standard aufgenommen wurde, lag in der Symmetrie mit tail(und in der Abwärtskompatibilität mit vorhandenen Unix-Implementierungen).

Kusalananda
quelle
Dies ist die aufschlussreichste Antwort, die erste Antwort ist ein seltsamer Hack. Ich wusste, dass es etwas Seltsames gibt, danke, dass du mir die Geschichte von Grep und Ed gezeigt hast. Es macht jetzt alles Sinn.
Tomas Zubiri
6

Solange die erste Zeile keine eindeutige Zeichenfolge enthält, können Sie dies nicht nur mit grep tun. head -n 1 file.txtwürde an seiner Stelle arbeiten.

Wenn Sie die erste Zeile nur ausdrucken möchten, wenn sie mit einem Muster übereinstimmt, setzen Sie die Pipe head auf grep

head -n 1 * | grep [pattern]

Kurt Heisel
quelle
2

Noch eine unkonventionelle Verwendung von Grep - eine Schwartzsche Transformation , die mehrere Kreisel durchläuft, um die Zeilen zu nummerieren. Anschließend sucht sie mit grep nach der Zeilennummer und entfernt die Zeilennummer wieder:

function grep1() (
  nlines=$(wc -l < "$1")
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep '^1 ' | sed 's/^1 *//'
)

function greplast() (
  nlines=$(wc -l < "$1")
  nlines=$((nlines + 0))
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep "^$nlines " | sed "s/^$nlines *//"
)

Ich füge diese Antwort hier als Beispiel für die Idee ein, dass nur, weil Sie etwas tun können (grep oder bash oder ... usw.), nicht bedeutet, dass Sie sollten - es gibt wahrscheinlich ein besseres Werkzeug für den Job. sed ( sed 1qoder sed -n 1p) und head ( head -n 1) sind die am besten geeigneten Werkzeuge zum Drucken der ersten Zeile aus einer Datei. Zum Drucken der letzten Zeile einer Datei haben Sie tail -n 1odersed -n '$p'. Diese Tools sind nicht nur ein einziger Befehl (anstelle von 3+ in den oben genannten Funktionen), sondern auch für zukünftige Leser - vielleicht sogar für Sie selbst! - der Skripte, in denen sie sich befinden. Obwohl ich nicht einer der (derzeit 3) Abwähler Ihrer Frage bin, ist es wahrscheinlich, dass Ihr Beharren auf einem willkürlichen Tool für den Job (ohne Begründung) der Grund dafür ist die downvotes. Es ist äußerst unwahrscheinlich , dass ein System , das hat grepauch nicht hat head, tailund sed.

Jeff Schaller
quelle