이름이 같은 일부 로그 파일에 대한 경로가 포함된 텍스트 파일이 있습니다.
/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 배열은 0에서 색인이 생성되므로 배열 색인에 1을 추가하여 파일 이름을 만들었습니다.
답변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
일부 줄은 공백으로 시작하지만 후속 출력에는 공백이 표시되지 않습니다. 이는 장면에 영향을 미칠 수도 있고 그렇지 않을 수도 있습니다.