2012-10-16 13 views
7

Czy istnieje sposób na połączenie komendy head 1 i grep w jeden dla wszystkich plików w katalogu i przekierowanie danych wyjściowych do pliku wyjściowego. Mogę to zrobić za pomocą "sed", ale wygląda na to, że nie jest tak szybki jak grep.Dołącz nagłówek do wyniku "grep"

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

Korzystanie grep mogę zrobić następującą jeden plik na raz:

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

Jednak trzeba to zrobić dla wszystkich plików w katalogu. Wstawianie symbolu wieloznacznego nie pomaga, ponieważ najpierw drukuje nagłówki, a potem grep.

+0

Oczywiście to nie jest tak szybka jak grep; grep robi mniej. –

Odpowiedz

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

Dzięki @Ignacio. Dodaję również nazwę pliku, aby śledzić, skąd pochodzą dane w pliku wyjściowym, a zatem dodano "plik" $ plik ";". Jednak w wynikach dołącza "tekst ASCII" dla ex: file1.txt: Tekst ASCII – Curious

+0

Cóż, właśnie to 'plik' ma ... –

0

Cześć Curious możesz używać xargs z twoim cmd.

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

Gdzie/Mahesh jest dir, w którym pliki są i wyjście jest umieszczony wewnątrz /tmp/out.x

20

następujących środków wystarczy wpisać komendę raz (zamiast używać & & i pisania dwa razy), jest to również dość łatwe do zrozumienia.

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

np.

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

UPDATE: Wydaje się to tylko do pracy ps, przepraszam, ale myślę, że to jest zwykle to, co ludzie chcą to dla.

+0

NB: To wydaje się działać z' ps', ale nie z żadnym innym poleceniem (df, ls, cat, itp.). –

+0

@BrianPapantonio Tak, nie mam pojęcia, dlaczego tak jest, raczej dziwne. Wiesz dlaczego? – samthebest

+1

Po dokładniejszym zbadaniu, widzę, że działa z 'ps -e', ale nie' ps'. Najwyraźniej 'ps -e' wysyła najpierw linię nagłówka, a następnie nie wysyła niczego, a następnie buforuje resztę danych wyjściowych. 'head' musi myśleć, że strumień jest zamknięty po pierwszej linii, więc wychodzi, pozostawiając grep, aby zobaczyć resztę. tl; dr: Ta sztuczka działa przez przypadek. –

0

bym zrobił, że:

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