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.
}

这里lsf是通过-v选项设置主脚本中的用户自定义值..

第一个

您必须将引号 ' 替换为双引号 " 才能看到变量 $num 展开!

而不是使用 head | tail,尝试 sed:

find $dir -type f -name  -exec sed $num'q;d' {} \;

我的目的(使用纯):

没有 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