2014-11-19 5 views
0

Привет Я использую команду find в своем скрипте, чтобы получить список файлов журнала, измененных за один день, и используя список для grep. Но если файл не найден, значит, он не выходит из оболочки. Могу ли я использовать какие-либо условия для проверки перед использованием команды. Если да, то как это проверить.Как проверить список команд, если нет файлов, а затем exit

#!/bin/bash 
grep 'EXSTAT|' $(find . -mtime 0 -type f)|grep '|S|'|/usr/xpg4/bin/awk -F"|" '{a[$11]++;c[$11]+=$14}END{for(b in a){print b"," a[b]","c[b]/a[b]}}' 

Я пробовал только grep ниже, но без ответа, и я должен заканчивать CTRL + C.

bash-3.2$ ls -ltr 
total 126096 
-rw-r----- 1 tibco tibco 10486146 Sep 4 09:20 ivrbroker.log.6 
-rw-r----- 1 tibco tibco 10486278 Sep 9 14:45 ivrbroker.log.5 
-rw-r----- 1 tibco tibco 10492782 Sep 14 14:54 ivrbroker.log.4 
-rw-r----- 1 tibco tibco 10487657 Sep 16 13:17 ivrbroker.log.3 
-rw-r----- 1 tibco tibco 10486437 Oct 29 10:26 ivrbroker.log.2 
-rw-r----- 1 tibco tibco 10485955 Nov 17 11:28 ivrbroker.log.1 
-rw-r----- 1 tibco tibco 1537673 Nov 18 08:48 ivrbroker.log 

bash-3.2$ find . -mtime 0 -type f 
bash-3.2$ grep 'EXSTAT|' $(find . -mtime 0 -type f) 
#!/bin/bash 
bnkpath=/tibcouat1_fs/tibco/deployment/egypt/bnk/broker/logs/ 
file_list=$(find $bnkpath -mtime 0 -type f) 
if [ -z $file_list ]; then 
echo "No log file found" 
else 
echo "log file found" 
grep 'EXSTAT|' $(find $file_list -mtime 0 -type f)|grep '|S|'|/usr/xpg4/bin/awk -F"|" '{a[$11]++;c[$11]+=$14}END{for(b in a){print b"," a[b]","c[b]/a[b]}}' 
fi 
bash-3.2$ ./bnk1.sh   
./bnk1.sh: line 4: [: too many arguments 
log file found 

ответ

0

Команда grep держит терминал, потому что команда find возвращает NO имя файла. Это позволит эффективно иметь тот же эффект, как выполнение

grep 'EXSTAT|' 

Это потому, что Grep ожидает некоторый входной сигнал для себя, чтобы выполнить, если входной сигнал не будет дано (как в данном случае), он ищет STDIN для некоторых входных сигналов.

В качестве простого быстрого решения вы можете попробовать разбить команды find и grep. Что-то вроде этого будет работать

file_list=$(find . -mtime 0 -type f) 
! [ -z $file_list ] || grep 'EXSTAT|' $file_list |grep '|S|'|/usr/xpg4/bin/awk -F"|" '{a[$11]++;c[$11]+=$14}END{for(b in a){print b"," a[b]","c[b]/a[b]}}' 

сделаю.

+0

Я добавил условие в сценарии, если [- z $ file_list]; затем echo «Файл журнала не найден» еще echo «файл журнала найден», но слишком много аргументов на экране после этого вывода – Guru

+0

Вы забыли добавить fi. Конец if;) –

0

Я отредактировал ваш сценарий & применил некоторую модификацию.

  1. Вам необходимо использовать цикл FOR, поскольку file_list - это массив файлов.
  2. использовать -maxdepth, чтобы убедиться, что вы не смотрите в другом каталоге
  3. Линии 4 Ошибки приходит, как вы забыли двойные кавычки
bnkpath=/tibcouat1_fs/tibco/deployment/egypt/bnk/broker/logs/ 
file_list=$(find $bnkpath -maxdepth 1 -mtime 0 -type f) 
if [ -z "$file_list" ] 
then 
     echo "No log file found" 
else 
     echo "log file found" 
     for i in $file_list; 
     do 
     grep 'EXSTAT|' $i | grep '|S|' | /usr/xpg4/bin/awk -F"|" '{a[$11]++;c[$11]+=$14}END{for(b in a){print b"," a[b]","c[b]/a[b]}}' 
     done 
fi 
Смежные вопросы