unix查找命令错误

时间:2015-01-10 14:57:19

标签: bash unix find

我的命令如下:

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帮助:/ 感谢!!!

2 个答案:

答案 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. } ls通过f选项设置为主脚本中用户定义的值。