我需要在文件列表中查找单词列表。因此,我将单词列表放入文件中,并使用for
循环尝试读取文件中的每个单词,并使用 find 命令grep
在找到的文件列表中查找该单词。
我正在使用提到的 Linux 版本
bash-3.1$ uname
HP-UX
下面提到的是我的 shell 脚本。
#!/bin/sh
PATH="/NO/20171013"
STRING=`/usr/bin/cat /home/test/STAT44_test.txt`
for LINE in ${STRING}
do
echo "find ${PATH} -type f -name \"*.txt\" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l"
LINES=`find ${PATH} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l`
echo "LINES count is ${LINES}"
if [ ${LINES} -eq 0 ]
then
echo "In not found"
# echo "${LINE} is not found in ${PATH}" >> /home/test/STAT44_not_found.out
else
echo "In Found"
# echo "${LINE} is found in ${PATH}" >> /home/test/STAT44_found.out
fi
done
find 命令find ${PATH} -type f -name "*.txt" -exec grep -w '${LINE}' {} \; 2>/dev/null
在命令提示符下完美运行,但如果在 shell 脚本中使用(如上所述),则不会给出任何输出。
的输出echo $?
为 0,但 find 命令不产生任何输出。
脚本的输出是
find /NO/20171013 -type f -name "*.txt" -exec grep -w 655044810645 {} \; 2>/dev/null | /usr/bin/wc -l
LINES count is 0
In not found
find /NO/20171013 -type f -name "*.txt" -exec grep -w 734729751028 {} \; 2>/dev/null | /usr/bin/wc -l
LINES count is 0
In not found
实际上,*.txt
下面的文件/NO/20171013
有带有模式655044810645
和734729751028
.因此Word count
不应该是 0 并且它必须进入else
部分。
可能缺少什么?
答案1
$PATH
是有意义的重要变量。您应该选择另一个名称。
在这种情况下,find
无法找到可执行文件,因为$PATH
不会导致它。没有通知您是因为2>/dev/null
。
echo
可能是 shell 内置的,它不需要$PATH
工作。for
等也一样。
答案2
第一的,设置一个适当的$PATH
(并查看答案卡米尔·马乔罗夫斯基):
使用合适的用户(root?)登录并执行:
echo PATH=$PATH
在脚本的开头添加输出
或者您可以添加命令的完整路径find
。如果您不知道find
放置在哪里,请执行:
which find
输出将是这样的:/usr/bin/find
你在循环内有一个错误:
您需要将单引号替换为双引号(围绕${LINE}
),否则变量将不会被解释:
echo "find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l"
LINES=`find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l`
一些注意事项:
- 你不需要
cat file
,尝试使用循环代替。但只用while
,不可用for
!阅读为什么你不阅读带有“for”的行和如何逐行(和/或逐字段)读取文件(数据流、变量)?