用于字符串列表的UNIX脚本查找不在任何文件中的字符串
我正在分析一个属性文件,以获取属性列表。我想检查使用这些属性的所有位置(目标目录和子目录),标记在属性文件中定义但在目标目录中未使用的任何位置。到目前为止,我已经用于字符串列表的UNIX脚本查找不在任何文件中的字符串,unix,scripting,grep,Unix,Scripting,Grep,我正在分析一个属性文件,以获取属性列表。我想检查使用这些属性的所有位置(目标目录和子目录),标记在属性文件中定义但在目标目录中未使用的任何位置。到目前为止,我已经 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
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
检查grep的返回代码 您可以通过检查$?变数 如果为0,则找到该字符串,否则找不到该字符串。如果不是0,则将该字符串添加到“未找到”数组中,该数组应为未找到属性的列表
grep "string"
if [$? -ne 0]
then
string not found
fi
- 在读取道具时使用
xyz,而不是在``xyz``中为道具使用
;对于
可以任意变大的情况,请执行xyz
- 使用
执行grep-l…>/dev/null | | xyz
如果xyz
未能匹配,并放弃grep
输出dogrep
而不执行/dev/null
,如果找到一个匹配(xyz
在第一次匹配后停止-l
,如果有,使其更有效)grep
$TARGETROOT
下处理大量属性和/或文件,可以使用以下更有效的方法(只打开和扫描每个文件一次,而不是以前解决方案的N
次,其中N
是$file
中的属性数):
- 使用带有
中所有已排序属性的临时文件以避免重复工作$file
- 使用
隔离另一个文件中出现的所有已排序属性awk…|sort-u
$FILE2
- 使用
隔离那些只出现在comm-23“$PROPSFILE”-
中而不出现在标准输入(即$PROPSFILE
中)的行(属性)$FILE2
如果[$?-ne 0]
。我同意William的观点:直接在条件句中使用结果;在少数情况下,您需要$?
,但这似乎不是其中之一。有时,grep+awk
可用于大文件grep
搜索模式,并awk
处理grep
的搜索算法更好。在sed
脚本中,您正在进行替换,这是一项昂贵的操作。使用awk
对字段进行拆分要快得多。正确,并且假设$FILE
的大小不是兆字节,因此sed
无法有效工作。在这些情况下,将grep
和awk
组合成awk-F='$1~/^[A-Z]*$/&&NF>1{print$1}'
将减少冗余。我将第二个示例更新为使用awk
而不是sed
。您甚至可以将sort-u | comm-23..而..
合并到awk
)。减少3个管道流程。这可能太过分了。:)现在我们已经摆脱了sed,并且可以假设有兆字节的数据;)我不会在awk
散列中开始做sort
和comm
的工作,因为一个sort
和comm
会在多核机器上漂亮地伸缩,比单个awk
要好得多。我不知道你从哪里知道awk不会“漂亮地伸缩”在多核机器上,但在一个awk进程内完成所有工作肯定更有效。不要忘记shellwhile read循环,当要迭代的数据很大时,这是一个主要的慢戳。无论如何,这是OT,并且+1表示实际全面地做某事:)
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
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"