我正在解析属性文件以获取属性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
答案 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``; 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"