2013-03-31 3 views
9

Моя программа выглядит так.Что делает grep -v '^ #' do

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` 

Я запустил этот скрипт, указав имя файла в качестве параметра, в котором будет присутствовать список зондов.

У меня есть 2 вопроса

  1. Что grep -v '^#' значит. Я узнал, что '^ обычно используется для соответствия определенной строке. Но в имени файла, которое я даю, нет #. Более того, я получаю общее количество проб для cat $1 | grep -v '^#' | wc -l.

  2. echo $FINISHED"+1"|bc. Здесь любая идея относительно того, почему разработчик добавлен |bc?

+2

Grep бит соответствует только строки, которые не начинаются с #, если я помню правильно -v. '^' - регулярное выражение для начала строки, а '#' должно быть именно таким. Если я ошибаюсь, '-v' инвертирует соответствие, поэтому вы получаете строки, которые не являются комментариями (поскольку # обычно является маркером комментария файла conf). – ssube

+1

Кроме того, если вы используете оболочку BASH, 'FINISHED = \' echo $ FINISHED "+1" | bc \ '', вероятно, может быть заменен на 'FINISHED = $ ((FINISHED + 1))' - устранение необходимо создать дополнительный подпроцесс. – jedwards

ответ

25
  • ^ означает "начало строки"
  • # буквальный характер #
  • -v означает "инвертировать матч" в Grep, другими словами, вернуть все не соответствующие линии.

Поместите их вместе, и ваше выражение «выбрать все строки, которые не начинаются с #»

| является характер трубы, он принимает вывод команды на левой стороне, и использует это как ввод команды с правой стороны. bc - это как калькулятор командной строки (для выполнения базовой математики).

+3

& добавить, МНОГИЕ (не все) языки имеют # как символ комментария строки. Поэтому 'grep -v^#' будет соответствовать строкам без комментариев. – anishsane

+0

Эти языки обычно позволяют комментировать не начинаться в начале строки, поэтому это не будет работать с строками типа « # <комментарий». – aragaer

0

У нас есть разные способы расчета. Выберите тот, который вам нравится.

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

Я бы использовал это, чтобы исключить комментарии из кода, который я читаю. Итак, все строки комментариев начинаются с #, и я не хочу их видеть, если их слишком много.

Grep -v '^ #'