Bash -> alle zeilen eines inputs - nach Suchwort ausgeben

FreeBSD, Gentoo, openSUSE, CentOS, Ubuntu, Debian
drfuture
Posts: 20
Joined: 2004-07-08 14:48

Bash -> alle zeilen eines inputs - nach Suchwort ausgeben

Post by drfuture » 2007-06-22 11:18

Moin,
Ich möchte die Ausgabe eines Programmes so verändern das ich nach einem Begriff suche, und alle Zeilen die nach diesem Suchwort kommen ausgegeben werden.

theo. könnte ich ja mit wc die zeilen zählen, mit grep die zeile herrausfinden in der das Suchwort vorkommt - und dann mit tail -n(gesammtzeilen - position)

Nur wüsste ich nicht wie ich den Output in mehrere anwendungen pipen kann, um Zeilen zu zählen, + nen grep zu machen...

Dann hab ich noch beim awk geschaut, aber ehrlichgesagt baucht man da wohl erste nen lehrgang :)

Hat jemand eine Idee, bzw. evtl. schon so etwas im Einsatz?

User avatar
Joe User
Project Manager
Project Manager
Posts: 11599
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Bash -> alle zeilen eines inputs - nach Suchwort ausgeben

Post by Joe User » 2007-06-22 12:06

Quick&Dirty&Untestet:

Code: Select all

#!/bin/bash

searchword="SearchWord"
searchfile="/root/searchfile"
outputfile="/root/outputfile"

searchline="$(grep -n "${searchword}" ${searchfile} | head -n 1 | sed 's/:([0-9][0-9]*)/1/')"
let taillines="$(wc -l ${searchfile}) - ${searchline}"
tail -n ${taillines} ${searchfile} > ${outputfile}

exit 0

r. u. serious
RSAC
Posts: 93
Joined: 2006-06-10 14:17

Re: Bash -> alle zeilen eines inputs - nach Suchwort ausgeben

Post by r. u. serious » 2007-06-22 12:13

Code: Select all

awk '/suchwort/ {seen = 1}; seen==1 { print $0 }' dateiname
awk ist eigentlich ganz simpel, wenn man sich einmal eingelesen hat, es ist immer eine folge von "pattern { action statements }". Standardmäßig wird gegen die ganze Zeile gematched (ansonsten könnte man explizit auch $0 ~ /suchwort/ am Anfang der Zeile schreiben), wenn suchwort gesehen wird, wird die Variable seen auf 1 gesetzt (undefinierte variblen sind immer 0). im Zweiten befehl wird "seen" geprüft und ggf. die Zeile ausgegeben.

Wenn du mehrere Dateien durchjagen willst, mußt du seen natürlich zu Beginn einer Datei die variable seen auf 0 setzen (FILENAME ist eine vordefinierte variable):

Code: Select all

awk 'FILENAME != oldfile {oldfile=FILENAME; seen=0}; /suchwort/ {seen = 1}; seen==1 { print $0 }' dateina*

[Ändern mußt du jeweils den String "suchwort", und am Ende der Zeile die dateinamen die du an awk übergibst]

juergen
Posts: 133
Joined: 2004-03-30 14:44

Re: Bash -> alle zeilen eines inputs - nach Suchwort ausgeben

Post by juergen » 2007-06-22 18:37

Das ist eigentlich ein typischer awk Job, sed kann das aber auch.

Code: Select all

sed -n '/MUSTER/,$p'
Noch kürzer ;-)

r. u. serious
RSAC
Posts: 93
Joined: 2006-06-10 14:17

Re: Bash -> alle zeilen eines inputs - nach Suchwort ausgeben

Post by r. u. serious » 2007-06-23 00:08

Eek, war ja klar, dass jemand es immer noch kürzer kann. :D

Aber immerhin, wenn man mehrere Dateien übergibt (ob mit oder ohne xargs), steht die awk-Lösung wieder besser da.;)

juergen
Posts: 133
Joined: 2004-03-30 14:44

Re: Bash -> alle zeilen eines inputs - nach Suchwort ausgeben

Post by juergen » 2007-06-23 00:52

Nicht wirklich ;-). Natürlich ist sed in primär ein Streameditor für EINEN stream... Aber GNU sed hat praktische Extensions:

Code: Select all

sed --separate -n '/MUSTER/,$p' FILE1 FILE2
GNU sed und awk sind beide ziemlich fett ;-)

r. u. serious
RSAC
Posts: 93
Joined: 2006-06-10 14:17

Re: Bash -> alle zeilen eines inputs - nach Suchwort ausgeben

Post by r. u. serious » 2007-06-23 08:15

Wieder was gelernt! :)