Ich habe eine Datei Element_query
mit dem Namen, die das Ergebnis einer Abfrage enthält:
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
Ich möchte die erste und letzte Zeile mit dem Shell-Befehl löschen.
Antworten:
GNU benutzen
sed
:Wie es funktioniert :
-i
Option bearbeiten Sie die Datei selbst. Sie können diese Option auch entfernen und die Ausgabe in eine neue Datei oder einen anderen Befehl umleiten, wenn Sie möchten.1d
löscht die erste Zeile (1
nur auf die erste Zeile einwirken,d
um sie zu löschen)$d
löscht die letzte Zeile ($
um nur die letzte Zeiled
zu bearbeiten, um sie zu löschen)Weitergehen :
1,5d
Würde zum Beispiel die ersten 5 Zeilen löschen.SQL>
der Anweisung beginnt/^SQL> /d
/^$/d
statement1;statement2;satement3;...
) trennen oder in der Befehlszeile (-e 'statement1' -e 'statement 2' ...
) separat angeben.quelle
1,3d
die ersten drei Zeilen werden gelöscht), das Ende ist jedoch etwas schwieriger. Je nachdem, was Sie möchten, können Sie dies besser nutzen:sed -i '/^SQL> /d' Element_query
um Zeilen zu löschen, dieSQL>
unabhängig davon beginnen, wo sie sich in der Datei befinden.sed
Einzeiler - mit dem beliebige Zeilenzahlen am Anfang und Ende einer Datei entfernt werden können. Besser ist es jedoch, eine einzelne Eingabe über zweihead
Prozesse zu gruppieren, solange es sich um eine reguläre Datei handelt schnellste Weg, dies normalerweise zu tun.sed -i '1d' table-backup.sql
die erste Zeile der SQL-Textdatei gelöschtKopf; Kopf
Mit der obigen Option können Sie die erste Anzahl von Zeilen angeben, die mit dem ersten
head
Befehl vom Kopf der Ausgabe entfernt werden sollen , und die Anzahl von Zeilen, in dieoutfile
mit dem zweiten Befehl geschrieben werden soll . Dies ist in der Regel auch schneller alssed
- insbesondere bei umfangreichen Eingaben -, obwohl zwei Aufrufe erforderlich sind. Wo aufsed
jeden Fall sollte jedoch bevorzugt wird, ist in dem Fall , dass<infile
ist nicht eine regelmäßige, lseekable Datei - denn dies wird in der Regel nicht arbeiten , wie in diesem Fall bestimmt, sondernsed
kann alle Ausgänge Änderungen in einem einzigen Skript Prozess behandeln.Mit einer GNU können
head
Sie die-
negative Form auch[num]
im zweiten Befehl verwenden. In diesem Fall werden mit dem folgenden Befehl die erste und die letzte Zeile von der Eingabe entfernt:ODER mit einem POSIX
sed
:Angenommen, ich habe eine Eingabe von 20 Zeilen gelesen und wollte die ersten 3 und die letzten 7 Zeilen entfernen. Wenn ich mich dazu entschließen
sed
würde, würde ich dies mit einem Endpuffer tun. Ich würde zuerst drei und sieben addieren, um insgesamt zehn Streifen zu zählen, und dann tun:Dies ist ein Beispiel, bei dem die ersten 3 und letzten 7 Zeilen von der Eingabe entfernt werden. Die Idee ist, dass Sie so viele Zeilen puffern können, wie Sie möchten, um das Ende der Eingabe im Musterbereich auf einem Stapel zu
P
entfernen, aber nur die erste Zeile für jede eingezogene Zeile zu drucken.1,10
sed
P
wird nichts gedruckt, da für jede Zeile die Eingabe zeilenweise in einerb
Ranch-Schleife im Musterraum gestapelt wird.sed
Stapeld
gelöscht - und so werden die ersten drei Zeilen auf einen Schlag von der Ausgabe entfernt.sed
die$
letzte Eingabezeile erreicht ist und versucht, dieN
ext zu ziehen, wird EOF gedrückt und die Verarbeitung wird vollständig gestoppt. Zu diesem Zeitpunkt enthält der Musterraum jedoch alle Linien,14,20
von denen noch keineP
gedruckt wurden und es niemals sind.sed
P
wird nur bis zur ersten\n
ewline im Musterbereich gedruckt und dieseD
gelöscht, bevor ein neuer Zyklus mit den verbleibenden - oder den nächsten 6 Eingabezeilen beginnt. Die 7. Zeile wird mit demN
Befehl ext im neuen Zyklus wieder an den Stack angehängt .Von der
seq
Ausgabe (die 20 fortlaufend nummerierte Zeilen umfasst) werden alsosed
nur folgende Daten ausgegeben :Dies wird problematisch, wenn die Anzahl der Zeilen, die Sie vom Ende der Eingabe entfernen möchten, groß ist - da
sed
die Leistung direkt proportional zur Größe des Musterraums ist. Dennoch ist es in vielen Fällen eine praktikable Lösung - und POSIX gibt einensed
Musterbereich vor, der vor dem Busting mindestens 4 KB verarbeitet.quelle
tail
unterstützt auch die erweitertetail -n+<num>
Syntax "start from line<num>
"Ich werde nicht antworten, wie man eine Anzahl von Zeilen löscht. Ich werde das Problem folgendermaßen angreifen:
grep -v '#SQL>' Element_query >outfile
Anstatt Zeilen zu zählen, werden die SQL-Befehle durch Erkennen der Eingabeaufforderungen entfernt. Diese Lösung kann dann für andere Ausgabedateien von SQL-Sitzungen mit mehr Befehlen als nur zwei verallgemeinert werden.
quelle
ed
ist 'der Standard-Texteditor' und sollte auf Systemen ohne GNU verfügbar seinsed
. Es wurde ursprünglich als Texteditor entwickelt, eignet sich jedoch gut für Skripte.1d
löscht die erste Zeile der Datei$d
(in Anführungszeichen gesetzt, damit die Shell nicht glaubt, dass es sich um eine Variable handelt), löscht die letzte Zeile,w
schreibt die Datei undq
beendet sieed
.printf
wird hier verwendet, um die Befehle zu formatierened
- auf jeden muss eine neue Zeile folgen; es gibt natürlich auch andere möglichkeiten, dies zu erreichen.quelle
Es gibt verschiedene Möglichkeiten, führende und nachfolgende Zeilen aus einer Datei zu entfernen.
Sie können
awk
sowohl die Mustererkennung als auch die Zeilenzählung verwenden,Sie können
grep -v
Linien, die Sie nicht möchten, anhand des Musters ausschließen und mithilfe der-E
Option mehrere Muster abgleichen.Sie können
head
und verwendentail
, um bestimmte Zeilenzahlen zu kürzen,Sie können
vi/vim
die erste und letzte Zeile (n) verwenden und löschen.Sie könnten ein Perl-Skript verwenden, die erste Zeile überspringen, jede Zeile speichern und drucken, wenn Sie eine nächste Zeile erhalten.
quelle
head
s braucht man die Pfeife eigentlich nicht, und eigentlich ist es besser, sie gar nicht zu benutzen, wenn man damit durchkommt. Dabeihead | head
können die beiden Prozesse zwar gleichzeitig ausgeführt werden, sie verarbeiten jedoch praktisch alle Daten redundant. Wenn Sie dies stattdessen tun{ head >dump; head >save; } <in
, überspringen Sie nur nach Versatz - der erste liest 10 Zeilen aus>dump
und der zweite liest die nächsten 10 Zeilen aus>save
.Sie würden bei weitem besser bedient werden Wegschneiden die SQL - Befehle. Sie können dies auf zwei Arten tun:
Wenn Sie absolut sicher , dass die Folge „
SQL>
“ ist nicht irgendwo sonst in der Ausgabe auftreten,Wenn Sie nicht so sicher sind,
Die zweite Version ist langsamer, aber genauer: Sie ignoriert Zeilen, die genau mit "SQL>" beginnen und mit einem Semikolon enden. Dies scheint die zu entfernenden Zeilen zu beschreiben.
Es ist jedoch besser, diese zusätzliche Ausgabe zunächst nicht in die Datei zu schreiben. Die meisten SQL-Systeme haben eine Möglichkeit, dies zu tun. Ich bin nicht sehr vertraut mit Oracle, aber vielleicht ist diese Antwort hilfreich.
quelle
Sie können die Zeilen zwischen einem Bereich in auswählen
awk
(dies setzt voraus, dass Sie wissen, wie viele Zeilen es gibt):Oder in Perl:
Wenn Sie nicht wissen, wie viele Zeilen es gibt, können Sie diese im Handumdrehen mit berechnen
grep
(beachten Sie, dass dies keine leeren Zeilen zählt, verwenden Sie auch, um siegrep -c '' file
zu zählen):quelle
Versuchen Sie diese Lösung:
Anpassung
Sie können es leicht anpassen, um die n ersten Zeilen zu löschen, die das
+2
von änderntail
;oder um die letzten n Zeilen zu löschen, die das
-1
von ändernhead
.quelle
Verwenden von
awk
:< inputfile
: leitet den Inhalt voninputfile
toawk
's umstdin
> outputfile
: leitet den Inhalt vonawk
's weiterstdout
zuoutputfile
NR>1
: führt die folgenden Aktionen nur aus, wenn die Anzahl der verarbeiteten Datensätze größer als 1 ist{print r}
: druckt den Inhalt der Variablenr
{r=$0}
: Weist der Variablen den Inhalt des Datensatzes zu, der gerade verarbeitet wirdr
Also bei der ersten Ausführung des
awk
Skripts wird also der erste Aktionsblock nicht ausgeführt, während der zweite Aktionsblock ausgeführt wird und der Inhalt des Datensatzes der Variablen zugewiesen wirdr
. Bei der zweiten Ausführung wird der erste Aktionsblock ausgeführt, und der Inhalt der Variablenr
wird gedruckt (der vorherige Datensatz wird also gedruckt). Dies hat den Effekt, dass jede verarbeitete Zeile außer der ersten und der letzten gedruckt wird.quelle
r
.