用于字符串列表的UNIX脚本可以找到不在任何文件中的字符串

时间:2010-03-03 14:55:05

标签: unix scripting grep

我正在解析属性文件以获取属性defiend列表。我想检查这些属性使用的所有位置(目标目录和子目录),标记属性文件中定义的任何位置,但不在targer目录中的任何位置使用。到目前为止我已经

FILE=$1
TARGETROOT=$2

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

done;

在这个循环中,我想找到那些不在$ TARGETROOT或其子目录中的$ LINE变量

示例文件

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

许多文件包含通过

引用的属性
FILE 1
PropAValue = a

2 个答案:

答案 0 :(得分:2)

检查grep的返回码。

你可以通过检查$来做到这一点吗?变量

如果为0,则找到该字符串,否则找不到该字符串。如果不是0,则将该字符串添加到“未找到”数组中,该数组应该是未找到属性的列表。

grep "string" 
if [$? -ne 0] 
then 
   string not found 
fi

答案 1 :(得分:1)

  • xyz | while read PROP代替for PROP in ``xyz``; doxyz可以任意增加
  • 如果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"