我的命令如下:
P8.1 ~basicsys/win15/ex8/d1 cd 3 D A X F1 B
所以我有三个参数:dir(保存目录)str(我要查找的字符串)num(行号)
我需要做的是检查文件并检查str是否出现在行号中。
我需要打印像:
[File] [str出现在目录树某处的行号num的次数]。
输出:
A 1
B 3
D 2
F1 1
X 0
从我的调试中我发现我在执行find
命令时遇到问题(在此期间)。
这是我的代码:
dir=$1
shift
str=$1
shift
num=$1
shift
echo 'head -$num | tail -1' >| getLine
echo -n "" >| out
chmod +x getLine
while [ $# -gt 0 ]
do
echo -n $1 " " >> out
find $dir -type f -name $1 -exec getLine {} \; >| tmp
egrep -c $str tmp >> out
shift
done
sort out
也许问题出在echo 'head -$num | tail -1'
pleaseeeee帮助:/ 感谢!!!
答案 0 :(得分:1)
您必须使用双引号'
替换引号"
才能看到变量$num
已展开!
head | tail
:sed
find $dir -type f -name $1 -exec sed $num'q;d' {} \;
没有分支和临时文件。
#!/bin/bash
dir=$1 str=$2 num=$3
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
答案 1 :(得分:-1)
我认为,问题在于您的getLine
脚本不使用其参数。它可能适用于
# also, variable expansion does not work in '' strings, like the comments noted.
echo "head -\"$num\" \"$1\" | tail -1" >| getLine
然而,这种做法让我觉得相当丑陋。我会用这样的awk来做这件事:
#!/bin/sh
dir="$1"
shift
line="$1"
shift
str="$1"
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($0, s)) { ++c } nextfile } END { print f " " c }' '{}' +
done
这有两个关键组件:一个是+
调用中的find
使得它一次性将所有匹配的文件传递给awk命令(对于精确的语义,请参阅{{1手册页)。另一个是awk脚本:
find
此处FNR == l { # if the line is the lth in the file we're processing
if(index($0, 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
选项设置为主脚本中用户定义的值。