Скрипт UNIX для списка строк находит те, которых нет ни в одном файле - PullRequest
2 голосов
/ 03 марта 2010

Я анализирую файл свойств, чтобы получить список свойств. Я хочу проверить все места, где используются эти свойства (target dir и subdirs), отмечая все, которые определены в файле свойств, но не используются где-либо в targer dir Пока у меня есть

FILE=$1
TARGETROOT=$2

for LINE in `grep '[A-Z]*=' $FILE | awk -F '=' '{print$1}'`;
do

done;

Внутри этого цикла я хочу найти переменные $ LINE, которых нет в $ TARGETROOT или его подкаталогах

Файлы примеров

Properties File
a=1
b=2
c=3
...

Множество файлов, которые содержат ссылки на свойства через

FILE 1
PropAValue = a

Ответы [ 2 ]

2 голосов
/ 03 марта 2010

проверьте код возврата grep.

Вы можете сделать это, проверив $? переменная.

если это 0, то строка была найдена, иначе строка не была найдена. Если не 0, добавьте эту строку в массив «not found», и это должен быть ваш список не найденных свойств.

grep "string" 
if [$? -ne 0] 
then 
   string not found 
fi
1 голос
/ 10 марта 2010
  • Использование xyz | while read PROP вместо for PROP in ``xyz``; do для тех случаев, когда xyz может быть сколь угодно большим
  • Использование grep -l ... >/dev/null || xyz для выполнения xyz, если grep не соответствует, и отбрасывать вывод grep до /dev/null без выполнения xyz, если найдено одно совпадение (-l останавливается grep после первого матча, если таковой имеется, что делает его более эффективным)

    FILE=$1 
    TARGETROOT=$2
    
    grep '^[A-Z]*=' "$FILE2" | awk -F= '{print$1}' | while read PROP ; do
      find "$TARGETROOT" -type f | while read FILE2 ; do
        grep -l "^${PROP}=" "$FILE2" >/dev/null || {
          echo "Propery $PROP missing from $FILE2"
        }
      done
    done
    

Если вы имеете дело с большим количеством свойств и / или файлов в $TARGETROOT, вы можете использовать следующий, более эффективный подход (который открывает и сканирует каждый файл только один раз вместо N предыдущего решения, где N было количество свойств в $FILE):

  • Использование временного файла со всеми отсортированными свойствами из $FILE, чтобы избежать дублирования работы
  • Использование awk ... | sort -u для изоляции всех отсортированных свойств, появляющихся в другом файле $FILE2
  • Использование comm -23 "$PROPSFILE" - для выделения тех строк (свойств), которые появляются только в $PROPSFILE, а не на стандартном входе (то есть в $FILE2)

    FILE=$1 
    TARGETROOT=$2
    
    PROPSFILE="/tmp/~props.$$"
    grep '^[A-Z]*=' "$FILE" | awk -F= '{print$1}' | sort -u >"$PROPSFILE"
    
    find "$TARGETROOT" -type f | while read FILE2 ; do
      grep '^[A-Z]*=' "$FILE2" | awk -F= '{print$1}' | sort -u |
      comm -23 "$PROPSFILE" - | while read PROP ; do
        echo "Propery $PROP missing from $FILE2"
      done
    done
    
    rm -f "$PROPSFILE"
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...