2013-03-31 18 views
9

Mein Programm sieht so aus.was macht grep -v '^ #' tun

ALL=`cat $1 | grep -v '^#' | wc -l` 
FINISHED="0" 

for i in `cat $1 | grep -v '^#'`; do 
     echo "PROBE $i" 
I will be doing some operation 
FINISHED=`echo $FINISHED"+1"|bc` 

Ich werde dieses Skript ausführen, indem ich einen Dateinamen als Parameter gebe, wo eine Liste von Sonden vorhanden sein wird.

Ich habe 2 Fragen

  1. Was bedeutet grep -v '^#'. Ich habe gelernt, dass '^ normalerweise verwendet wird, um eine bestimmte Zeichenfolge zu finden. Aber im Dateinamen, den ich gebe gibt es keine #. Außerdem bekomme ich die Gesamtzahl der Sonden für cat $1 | grep -v '^#' | wc -l.

  2. echo $FINISHED"+1"|bc. Hier eine Idee, warum der Entwickler als |bc hinzugefügt?

+2

Die grep Bit entspricht nur Zeilen, die mit # beginnen nicht, wenn ich richtig mein -v erinnern. '^' ist Regex für Start-of-the-String, und '#' sollte genau das sein. Wenn ich nicht falsch liege, invertiert '-v' die Übereinstimmung, sodass Sie alle Zeilen erhalten, die keine Kommentare sind (da # normalerweise der Kommentarmarker für die Datei conf ist). – ssube

+1

Wenn Sie die BASH-Shell verwenden, kann 'FINISHED = \ echo $ FINISHED" +1 "| bc \' 'wahrscheinlich durch' FINISHED = $ ((FINISHED + 1)) 'ersetzt werden müssen einen zusätzlichen Subprozess erstellen. – jedwards

Antwort

25
  • ^ bedeutet "start of line"
  • # ist die wörtliche Charakter #
  • -v bedeutet "das Spiel invertieren" in grep, mit anderen Worten, kehren alle nicht passenden Linien.

diejenigen zusammen, und Ihr Ausdruck „wählen Sie alle Zeilen, die mit # nicht beginnen“

| ist das Pipe-Zeichen, es nimmt die Ausgabe des Befehls auf der linken Seite und Anwendungen es als Eingabe des Befehls auf der rechten Seite. bc ist wie ein Befehlszeilenrechner (um grundlegende Mathematik zu tun).

+3

& hinzuzufügen, viele (nicht alle) Sprachen haben # als Zeilenkommentarzeichen. Also würde 'grep -v^#' Nicht-Kommentar-Zeilen entsprechen. – anishsane

+0

In diesen Sprachen kann der Kommentar normalerweise nicht am Anfang der Zeile beginnen, daher funktioniert dies nicht mit Zeilen wie " # aragaer

0

Wir haben verschiedene Möglichkeiten zur Berechnung. Wählen Sie die, die Sie mögen.

a=`echo 1+1 | bc`; echo $a 
b=$((1+1)); echo $b 
c=`expr 1 + 1`; echo $c 
let d=1+1; echo $d 
2

Ich würde dies verwenden, um Kommentare aus dem Code, den ich gerade lese, auszuschließen. So beginnen alle Kommentarzeilen mit # und ich möchte sie nicht sehen, wenn sie zu viele sind.

grep -v '^ #'