shell 如何获取目录中没有某行文本的文件名?

piv4azn7  于 2023-03-19  发布在  Shell
关注(0)|答案(1)|浏览(100)

我正在运行一些实验,会将结果输出到相应的文件中,如果实验成功,文件中会有completed all的文本,我想输出实验不成功的情况,即文件中不存在“全部完成”语句,不同的实验结果可以通过文件名来区分。使用ls可以得到所有的文件,使用grep可以得到成功的文件,减法可以得到失败的文件名。
但我发现,所有的文件名总是输出.
1.当我使用两个简单数组进行验证时,结果是正确的。这表明减法函数是正确的。
1.当我单独输出所有文件名,或者输出正确的文件名时,输出也是正确的。
1.但是下面的代码在一起运行时会输出所有的文件名。

CURRENT_DIR=$(cd $(dirname $0); pwd)
ChampSim_path=$CURRENT_DIR/..
cd $CURRENT_DIR/$1

all=$(ls -q * | wc -l)

good=$(grep "ChampSim completed all CPUs" * | wc -l)

good_trace_prefetcher=($(grep  -Rl "ChampSim completed all CPUs" *  ))

all_trace_prefetcher=($(ls -q * ))

# echo  ${good_trace_prefetcher[@]}
# echo   ${all_trace_prefetcher[@]}

# exit
# arry_list1=(1 2 3 4 5 6 7 8 9)
# arry_list2=(3 5 8)

arry_list1=${all_trace_prefetcher[@]}
arry_list2=${good_trace_prefetcher[@]}
 
declare -a diff_list
t=0
flag=0

# echo arry_list1=${arry_list1[@]}
# echo arry_list2=${arry_list2[@]}
 
for list1_num in "${arry_list1[@]}"
do
    # echo list1_num is ${list1_num}
    for list2_num in "${arry_list2[@]}"
    do
        # echo list2_num is ${list2_num}
        if [[ "${list1_num}" == "${list2_num}" ]]; then
            flag=1
            break
        fi
    done
    if [[ $flag -eq 0 ]]; then
        diff_list[t]=$list1_num
        t=$((t+1))
    else
        flag=0
    fi
done
echo diff_list=${diff_list[@]}
gxwragnw

gxwragnw1#

您考虑过grep -vl 'searchstring' files吗?(或者如果您想要不区分大小写的匹配,则考虑-vil)。
示例:

$ echo 'completed all' > f1
$ echo 'completed all' > f2
$ echo 'completed all' > f3
$ echo 'error' > f4        
$ echo 'error' > f5
$ grep -vl 'completed all' *
f4
f5

相关问题