我有一个文本文件,其中包含某些名称相同的日志文件的路径。
/inc/sync/result/debug_TFS16.log
/inc/async/result/debug_TFS16.log
/dec/sync/result/debug_TFS16.log
/dec/async/result/debug_TFS16.log
如何一次一行选择路径并使用它来运行另一个脚本来进一步操作日志文件?
答案1
也许使用循环:
#! /bin/bash
COUNT=0
while read line
do
COUNT=`expr ${COUNT} + 1`
PATHIN=`dirname $line`
FILENAME=`cat $line | awk -F"/" '{print $NF}'`
cd ${PATHIN}
grep "max_val" ${FILENAME} > Log_${COUNT}.log
done < input_file
您只需更改 input_file 作为包含所有数据的文件的名称。
答案2
dirname
例如,您搜索的命令用于文件:
/dec/async/result/debug_TFS16.log
如果你执行
dirname /dec/async/result/debug_TFS16.log
你会得到
/dec/async/result
答案3
使用 bash 功能将文件名读入数组,
readarray -t list < input
for((i=0; i<${#list[@]}; i++))
do
grep max_val "${list[i]}" > log"$((i+1))".txt
done
这会将文件名读入数组变量list
,然后循环遍历该数组的索引 (in i
),并对相应的文件名运行 grep 命令,并将输出重定向到所需的日志文件名。 Bash 数组的索引为零,因此我将数组索引加一来创建文件名。
答案4
您可以使用循环跳过文件中的每一行while read
。这是一个示例文件,名为“samplefile.txt”。
root@server :~$ cat samplefile.txt
line 1
line #2
line3
line 4
#line5 shouldn't print
# line 6 shouldn't print either
line 7 should print
如果您想添加忽略以“#”开头的行的功能,可以将其添加到命令中。
root@server :~$ while read line ; do echo -e "$line" | egrep -v '\s*^#'; done < samplefile.txt
line 1
line #2
line3
line 4
line 7 should print
请注意,有些行以空格开头,但后面的输出没有显示这一点。这可能会也可能不会影响您的场景。