外部テキストファイルのアクセスパス

外部テキストファイルのアクセスパス

同じ名前のログファイルへのパスを含むテキストファイルがあります。

/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

一部の行はスペースで始まりますが、後続の出力にスペースは表示されません。これはシーンに影響を与えたり、そうでない場合があります。

関連情報