[LinuxOB] One-Liner

Daniel Dombrowski daniel.dombrowski at linuxob.de
Do Feb 19 23:30:03 CET 2004


On 2004.02.19 23:09, Christian Hesse wrote:
> On Thursday 19 February 2004 23:02, Daniel Dombrowski wrote:
> > On 2004.02.19 22:39, Christian Hesse wrote:
> > > Ich habe gleich noch einen. Damit lässt sich in der Kerneldoku
> > > jedes Vorkommen von frame finden...
> > >
> > > find /usr/src/linux/Documentation/ -type f | while read FILE; do
> > > GREP=`grep "frame" "$FILE"`; if [ -n "$GREP" ]; then echo "Found
> > > in file $FILE:"; echo $GREP; fi; done
> >
> > Und wo genau ist da jetzt der Untschied zu
> >
> > grep -R frame /usr/src/linux/Documentation/ | sed -e 's/^/Found in
> > file /' | sed -e 's/:/:\n/'
> >
> > (Außer, dass deine Version alle Treffer in jeder Datei ohne
> > Zeilenumbruch hintereinanderklatscht)?
> 
> Das ist eine Sache, die ich für Alexander zusammengesetzt habe. Wir
> sind auf ein paar Umwegen dahin gekommen...
> Es zeigt auf jeden Fall, was mit mit so einem Einzeiler alles machen
> kann. :)
> 
> Inzwischen habe ich das ganze Ding auch als alias gebaut:
> 
> alias search='function mysearch { find . -type f | while read FILE;  
> do GREP=`grep "$1" "$FILE"`; if [ -n "$GREP" ]; then echo "Found in  
> file $FILE:"; echo $GREP; fi; done; }; mysearch'
> 
> Mit dem Aufruf
> 
> search frame
> 
> im entsprechenden Verzeichnis kommen wir zu den gleichen Ergebnissen.
> Geht dann natürlich auch an der Stelle kürzer...

Ich habe ja auch nicht angezweifelt, was man mit einem Einzeiler alles  
machen kann; in einigen Fällen ist es ja auch nötig, lange Einzeiler zu  
schreiben. Aber gerade bei langen Einzeilern ist es nicht ganz  
unpraktisch, wenn die auch mal etwas kürzer ausfallen, damit der  
Überblick gewahrt wird. Denn m.E. ist das Ziel eines Einzeilers, eine  
bestimmte Problemstellung unter Zuhilfenahme von Standardtools so kurz  
und knapp und einfach wie möglich zu lösen. Natürlich kann man den  
Inhalt einer Datei auch so ausgeben:

cat file | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat |  
cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat |  
cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat |  
cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat |  
cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat |  
cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat |  
cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat

Selbst das kann man aber noch optimieren:

perl -e '$x = "cat file"; for (; $i < 83; $i++) { $x .= " | cat"};  
system $x'

Ab ca. 13 Pipes ist zweiteres kürzer. Und macht eigendlich das gleiche. :)

HINWEIS: Bei sehr vielen Pipes können Systeme mit niedrigen oder stark  
limitierten Ressourcen das u.U. böse quittieren.

Gruss

Daniel



Mehr Informationen über die Mailingliste linux