unix 查找命令错误
unix find command error
我的命令是这样的:
P8.1 ~basicsys/win15/ex8/d1 cd 3 D A X F1 B
所以我有三个参数:dir(保存目录)str(我要查找的字符串)num(行号)
我需要做的是检查文件并检查 str 是否出现在第 num 行。
我需要打印类似的东西:
[文件] [str 出现在目录树某处第 num 行的次数]。
输出:
A 1
B 3
D 2
F1 1
X 0
从我的调试中,我发现我执行 find
命令的行有问题(同时)。
这是我的代码:
dir=
shift
str=
shift
num=
shift
echo 'head -$num | tail -1' >| getLine
echo -n "" >| out
chmod +x getLine
while [ $# -gt 0 ]
do
echo -n " " >> out
find $dir -type f -name -exec getLine {} \; >| tmp
egrep -c $str tmp >> out
shift
done
sort out
也许问题也在echo 'head -$num | tail -1'
请帮忙:/
谢谢!!!
我认为问题在于您的 getLine
脚本没有使用它的参数。它可能适用于
# also, variable expansion does not work in '' strings, like the comments noted.
echo "head -\"$num\" \"\" | tail -1" >| getLine
但是,这种方法让我觉得相当丑陋。我会像这样用 awk 来做:
#!/bin/sh
dir=""
shift
line=""
shift
str=""
shift
for file in "$@"; do
find "$dir" -type f -name "$file" -exec awk -v f="$file" -v l="$line" -v s="$str" -v c=0 'FNR == l { if(index([=11=], s)) { ++c } nextfile } END { print f " " c }' '{}' +
done
这有两个关键组成部分:一个是 find
调用中的 +
使其一次性将所有匹配文件传递给 awk 命令(有关精确语义,请参阅 find
手册页)。另一个是awk脚本:
FNR == l { # if the line is the lth in the file we're processing
if(index([=12=], s)) { # and s is a substring of the line
++c # increase the counter
}
nextfile # short-circut to next file. This may fail with old versions
# of awk; it was introduced to the POSIX standard in 2012.
# It can be removed in that case, although that will make
# the script run more slowly (because it'll scan every file
# to the end)
}
END { # at the very end
print f " " c # print the results.
}
这里l
、s
、f
是通过-v
选项设置主脚本中的用户自定义值..
第一个
您必须将引号 '
替换为双引号 "
才能看到变量 $num
展开!
而不是使用 head | tail
,尝试 sed
:
find $dir -type f -name -exec sed $num'q;d' {} \;
我的目的(使用纯bash):
没有 forks 和 临时文件。
#!/bin/bash
dir= str= num=
shift 3
for name ;do
count=0
while read file ;do
mapfile -s $[num-1] -tn 1 lineNum <"$file"
[ "$lineNum" ] && [ -z "${lineNum//*$str*}" ] && ((count++))
done < <(find $dir -type f -name $name -print)
echo $name $count
done |
sort
我的命令是这样的:
P8.1 ~basicsys/win15/ex8/d1 cd 3 D A X F1 B
所以我有三个参数:dir(保存目录)str(我要查找的字符串)num(行号)
我需要做的是检查文件并检查 str 是否出现在第 num 行。
我需要打印类似的东西:
[文件] [str 出现在目录树某处第 num 行的次数]。
输出:
A 1
B 3
D 2
F1 1
X 0
从我的调试中,我发现我执行 find
命令的行有问题(同时)。
这是我的代码:
dir=
shift
str=
shift
num=
shift
echo 'head -$num | tail -1' >| getLine
echo -n "" >| out
chmod +x getLine
while [ $# -gt 0 ]
do
echo -n " " >> out
find $dir -type f -name -exec getLine {} \; >| tmp
egrep -c $str tmp >> out
shift
done
sort out
也许问题也在echo 'head -$num | tail -1'
请帮忙:/ 谢谢!!!
我认为问题在于您的 getLine
脚本没有使用它的参数。它可能适用于
# also, variable expansion does not work in '' strings, like the comments noted.
echo "head -\"$num\" \"\" | tail -1" >| getLine
但是,这种方法让我觉得相当丑陋。我会像这样用 awk 来做:
#!/bin/sh
dir=""
shift
line=""
shift
str=""
shift
for file in "$@"; do
find "$dir" -type f -name "$file" -exec awk -v f="$file" -v l="$line" -v s="$str" -v c=0 'FNR == l { if(index([=11=], s)) { ++c } nextfile } END { print f " " c }' '{}' +
done
这有两个关键组成部分:一个是 find
调用中的 +
使其一次性将所有匹配文件传递给 awk 命令(有关精确语义,请参阅 find
手册页)。另一个是awk脚本:
FNR == l { # if the line is the lth in the file we're processing
if(index([=12=], s)) { # and s is a substring of the line
++c # increase the counter
}
nextfile # short-circut to next file. This may fail with old versions
# of awk; it was introduced to the POSIX standard in 2012.
# It can be removed in that case, although that will make
# the script run more slowly (because it'll scan every file
# to the end)
}
END { # at the very end
print f " " c # print the results.
}
这里l
、s
、f
是通过-v
选项设置主脚本中的用户自定义值..
第一个
您必须将引号 '
替换为双引号 "
才能看到变量 $num
展开!
而不是使用 head | tail
,尝试 sed
:
find $dir -type f -name -exec sed $num'q;d' {} \;
我的目的(使用纯bash):
没有 forks 和 临时文件。
#!/bin/bash
dir= str= num=
shift 3
for name ;do
count=0
while read file ;do
mapfile -s $[num-1] -tn 1 lineNum <"$file"
[ "$lineNum" ] && [ -z "${lineNum//*$str*}" ] && ((count++))
done < <(find $dir -type f -name $name -print)
echo $name $count
done |
sort