用于字符串列表的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
    未能匹配,并放弃
    grep
    输出do
    /dev/null
    而不执行
    xyz
    ,如果找到一个匹配(
    -l
    在第一次匹配后停止
    grep
    ,如果有,使其更有效)

如果在
$TARGETROOT
下处理大量属性和/或文件,可以使用以下更有效的方法(只打开和扫描每个文件一次,而不是以前解决方案的
N
次,其中
N
$file
中的属性数):

  • 使用带有
    $file
    中所有已排序属性的临时文件以避免重复工作
  • 使用
    awk…|sort-u
    隔离另一个文件中出现的所有已排序属性
    $FILE2
  • 使用
    comm-23“$PROPSFILE”-
    隔离那些只出现在
    $PROPSFILE
    中而不出现在标准输入(即
    $FILE2
    中)的行(属性)


这听起来可能就是答案。你能给我一个你如何检查这个的例子吗?美元?变量保存最后执行的命令的退出代码。类似这样的内容:grep“string”如果[$?-ne 0],则未找到string。每当您不必要地计算$?,小猫就会死亡。只要做:如果格雷普。。。;然后。。。细化更多空格:
如果[$?-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进程内完成所有工作肯定更有效。不要忘记shell
while 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"