2012-10-16 13 views
7

Gibt es eine Möglichkeit, den Befehl 'head -1' und 'grep' für alle Dateien in einem Verzeichnis in eins zu kombinieren und die Ausgabe an eine Ausgabedatei umzuleiten. Ich kann dies mit 'sed' tun, aber es scheint, dass es nicht so schnell ist wie grep.Kopfzeile in das Ergebnis 'grep' einbeziehen

sed -n '1p;/6330162/p' infile*.txt > outfile.txt 

Mit grep kann ich zu einer Zeit, die folgenden eine Datei tun:

head -1 infile1.txt; grep -i '6330162' infile1.txt > outfile.txt 

Allerdings muß ich es für alle Dateien in dem Verzeichnis tun. Das Einfügen eines Platzhalters ist nicht hilfreich, da zuerst die Kopfzeilen und dann die Grep-Ausgabe gedruckt wird.

+0

Natürlich ist es nicht so schnell wie grep; Grep macht weniger. –

Antwort

1
for file in * 
do 
    [ "$file" = outfile.txt ] && continue 
    head -n 1 "$file" 
    grep -i '...' "$file" 
done > outfile.txt 
+0

Danke @Ignacio. Ich füge auch Dateiname hinzu, um zu verfolgen, woher die Daten in der Ausgabedatei kommen, und fügte so "Datei" $ file ";" hinzu. In der Ausgabe wird jedoch 'ASCII-Text' für zB: file1.txt: ASCII-Text angehängt. – Curious

+0

Nun, das macht 'Datei' ... –

0

Hallo Neugierig Sie können Xargs mit Ihrem cmd verwenden.

find /mahesh -type f |xargs -I {} -t /bin/sh -c "head -1 {}>>/tmp/out.x|grep -i 6330162 {} >>/tmp/out.x" 

Wo/mahesh, in denen dir ist Ihre Dateien und Ausgabe innerhalb /tmp/out.x

20

platziert die folgenden Mittel nur Sie einmal den Befehl eingeben müssen (anstatt & & und Typisierung es zweimal), es ist auch ziemlich einfach zu verstehen.

some-command | { head -1; grep some-stuff; } 

z.B.

ps -ef | { head -1; grep python; } 

UPDATE: Dies scheint nur für ps zu arbeiten, sorry, aber ich denke, das ist in der Regel, was die Leute für diese wollen.

+0

NB: Dies scheint mit' ps' zu funktionieren, aber nicht mit irgendeinem anderen Befehl (df, ls, Katze, usw.). –

+0

@BrianPapantonio Ja, keine Ahnung, warum das ist, ziemlich seltsam. Weißt du, warum? – samthebest

+1

Nach weiterer Untersuchung sehe ich, dass es mit 'ps -e' funktioniert, aber nicht mit' ps'. Offenbar sendet 'ps -e' die Kopfzeile zuerst, sendet dann nichts und puffert dann den Rest der Ausgabe. 'head' muss denken, dass der Stream nach der ersten Zeile geschlossen ist, so dass er austritt und grep übriglässt, um den Rest zu sehen. tl; dr: Dieser Trick funktioniert durch Zufall. –

0

ich hätte das getan:

ps -fe | awk '{ if (tolower($0) ~ /network/ || NR == 1) print $0}' 
Verwandte Themen