如果没有文件然后退出,如何检查查找命令文件列表

时间:2014-11-19 08:58:34

标签: linux bash shell unix

您好我在我的scrpt中使用find命令获取一天内修改的日志文件列表并使用list to grep。但如果没有找到文件,那么它就不会出现shell。在使用命令之前,我可以使用任何if条件进行检查。如果是,如何检查它。

#!/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

2 个答案:

答案 0 :(得分: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]}}'

会做的。

答案 1 :(得分:0)

我已编辑过您的脚本&应用了一些修改。

  1. 您需要使用FOR循环,因为file_list是一个文件数组。
  2. 利用-maxdepth确保您不会查看其他目录
  3. 第4行错误即将发生,因为您忘记了双引号
  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