同じ名前のログファイルへのパスを含むテキストファイルがあります。
/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行ずつパスを選択し、それを使用して別のスクリプトを実行してログファイルをさらに操作するにはどうすればよいですか?
答え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
一部の行はスペースで始まりますが、後続の出力にスペースは表示されません。これはシーンに影響を与えたり、そうでない場合があります。