对于家庭作业,我必须获取来自grep命令的结果,并写出它们中的前5个,从1到5进行编号。(打印数字,然后打印空格,然后打印grep中的行。)如果没有行,则打印一条消息说明这一点。到目前为止,我设法将grep命令存储在一个数组中,但这就是我遇到的问题:有谁能提供指导,告诉我如何按照上面的说明继续打印这个命令
pattern="*.c"
fileList=$(grep -l "main" $pattern)
IFS=$"\n"
declare -a array
array=$fileList
for x in "${array[@]}"; do
echo "$x"
done发布于 2016-11-29 23:23:51
如果只允许使用grep和bash(?):
pattern="*.c"
fileList=($(grep -l "main" $pattern))
if test ${#fileList[@]} = 0 ; then
echo "No results"
else
n=0
while test $n -lt ${#fileList[@]} -a $n -lt 5 ; do
i=$n
n=$(( n + 1 ))
echo "$n ${fileList[$i]}"
done
fi如果除了grep之外还允许使用命令,那么可以通过nl管道输出结果以添加行号,然后通过head将结果限制在前5行,然后通过第二个grep测试是否有任何行。例如:
if ! grep -l "main" $pattern | \
nl -s ' ' | sed -e 's/^ *//' | \
head -n 5 | grep '' ; then
echo "No results"
fi发布于 2016-11-30 00:06:36
您可以使用grep选项-c和-l
pattern="*.c"
searchPattern="main"
counter=1
while read -r line ; do
IFS=':' read -r -a lineInfo <<< "$line"
if [[ $counter > 5 ]]; then
exit 1
fi
if [[ ${lineInfo[1]} > 0 ]]; then
numsOfLine=""
while read -r fileline ; do
IFS=':' read -r -a fileLineInfo <<< "$fileline"
numsOfLine="$numsOfLine ${fileLineInfo[0]} "
done < <(grep -n $searchPattern ${lineInfo[0]})
echo "$counter ${lineInfo[0]} match on lines: $numsOfLine"
let "counter += 1"
else
echo "${lineInfo[0]} no match lines"
fi
done < <(grep -c $searchPattern $pattern)https://stackoverflow.com/questions/40869107
复制相似问题