Wie wähle ich mehrere Zeilen aus einer Datei oder aus einer Pipe in einem Skript?

7

Ich hätte gerne ein Skript namens lines.sh , an das ich Daten weiterleiten kann, um eine Reihe von Zeilen auszuwählen.

Zum Beispiel, wenn ich folgende Datei hätte:

test.txt

%Vor%

Dann könnte ich rennen:

%Vor%

und es würde

ausgeben %Vor%

Ich benutze zsh, würde aber eine Bash-Lösung bevorzugen, wenn möglich.

    
Brad Parks 16.12.2014, 16:58
quelle

7 Antworten

7

Sie können dieses awk verwenden:

%Vor%

Über ein separates Skript lines.sh :

%Vor%

Geben Sie dann Ausführungsberechtigungen:

%Vor%

Und nenne es:

%Vor%     
anubhava 16.12.2014, 17:54
quelle
3

Versuchen Sie sed :

%Vor%

-n zeigt sed an, um die Ausgabe zu unterdrücken, aber für die Zeilen 2 und 4 wird der Befehl p (print) zum Drucken dieser Zeilen verwendet.

Sie können auch Bereiche verwenden, z. B .:

%Vor%     
pfnuesel 16.12.2014 17:03
quelle
3

Zwei reine Bash-Versionen. Da Sie nach allgemeinen und wiederverwendbaren Lösungen suchen, können Sie sich auch ein wenig anstrengen. (Siehe auch letzten Abschnitt).

Version 1

Dieses Skript schlürft die gesamte stdin in ein Array (mit mapfile , also ist es ziemlich effizient) und druckt dann die Zeilen, die in seinen Argumenten angegeben sind. Bereiche sind gültig, z. B.

%Vor%

Sie können diese durch Leerzeichen oder Kommas trennen. Die Zeilen werden genau in der Reihenfolge der Argumente gedruckt:

%Vor%

druckt Zeile 1 zweimal, dann Zeile 2, dann Zeile 4, dann Zeilen 1, 2 und 3, dann alles von Zeile 4 bis zum Ende und schließlich wieder Zeile 1.

Hier geht's:

%Vor%
  • Pro: Es ist wirklich cool.
  • Con: Muss den gesamten Stream in den Speicher lesen. Nicht für unendliche Ströme geeignet.

Version 2

Diese Version behebt das vorherige Problem von unendlichen Streams. Sie verlieren jedoch die Fähigkeit, Zeilen zu wiederholen und neu anzuordnen.

Gleiches gilt für Bereiche:

%Vor%

druckt die Zeilen 1, 4, 5, 6, 9 und alles bis zum Ende. Wenn die Menge der Zeilen beschränkt ist, wird sie beendet, sobald die letzte Zeile gelesen wird.

%Vor%
  • Pro: Es ist wirklich cool und liest nicht den vollen Stream im Speicher.
  • Con: Zeilen können nicht als Version 1 wiederholt oder neu angeordnet werden. Geschwindigkeit ist nicht der stärkste Punkt.

Weitere Gedanken

Wenn Sie wirklich ein geniales allgemeines Skript wollen, das Version 1 und Version 2 tut und mehr, sollten Sie auf jeden Fall eine andere Sprache verwenden, z. B. Perl: Sie werden viel (insbesondere Geschwindigkeit) gewinnen! Du wirst in der Lage sein, schöne Optionen zu haben, die viel cooleres Zeug machen. Es lohnt sich auf lange Sicht, da Sie ein allgemeines und wiederverwendbares Skript haben möchten. Vielleicht hast du sogar ein Skript, das E-Mails liest!

Disclaimer. Ich habe diese Skripte nicht gründlich überprüft ... also hüte dich vor Fehlern!

    
gniourf_gniourf 16.12.2014 18:02
quelle
2

Schnelle Lösung für Ihren Freund. Eingabe:

test.txt

%Vor%

test.sh

%Vor%

Oder wenn Sie Ihr lines als Skript haben wollen:

linien.sh

%Vor%

Ausgabe in beiden Fällen:

%Vor%     
tinySandy 16.12.2014 18:14
quelle
2

Wenn es sich um eine einmalige Operation handelt und es nicht viele Zeilen zum Auswählen gibt, können Sie auswählen , um sie manuell auszuwählen:

%Vor%

Es öffnet sich ein interaktiver Bildschirm, in dem Sie auswählen können, was Sie möchten.

    
Bernardo Rufino 09.01.2016 04:25
quelle
1

Nun, vorausgesetzt, dass:

  • Ihre Datei ist klein genug
  • Sie haben kein Semikolon (oder ein anderes spezifisches Zeichen Ihrer Wahl) in der Datei
  • Es macht Ihnen nichts aus, mehrere Pipes zu verwenden

Sie könnten etwas wie:

verwenden %Vor%

Wobei -f2,4 die Zeilen angibt, die Sie extrahieren möchten

    
ChatterOne 16.12.2014 17:08
quelle
1

Versuchen Sie Folgendes:

%Vor%

Ich habe ein Skript mit 1 Dateiparameter und einer unbegrenzten Anzahl von Parametern für Zeilennummern erstellt. Sie würden es so nennen:

%Vor%     
Bolboa 16.12.2014 18:24
quelle

Tags und Links