長いフォルダのリストがあり、各フォルダには「log.dat」ファイルがあります。このファイルの特定の行の値を読みたいです。フォルダ名を親フォルダの「All.txt」ファイルに保存し、次のコードを実行します。
#!/bin/bash
in=/a/b/c #path to the file All.txt
for i in $(cat $in/all.txt); do
sed -n '/price/p' ${in}/${i}/log.dat
done
このコードはほとんどすべてのファイルを読み取ることができますが、何らかの理由で理解できません!次のエラーメッセージが出力されました。
/log.dat: No such file or directory #(then the path to this file)
sed -n '/price/p' log.dat
フォルダ内でコマンドを実行するとエラーメッセージが出力されます。私は答えを得た!
PS:ALL.txtファイル(親フォルダでコマンドを実行して生成されます)の内容はls>All.txt
次のとおりです。
STR-548-021-01
STR-548-021-02
STR-548-022-01
STR-548-022-02
STR-548-023-01
STR-548-023-02
.
.
.
.
.
私は次のように "sed"の代わりに "awk"コマンドを使ってみました。
awk '{ price }' ${in}/${i}/log.dat
同じエラーメッセージが表示されます。
これらのキャリッジリターンがLinux上でls> All.txtコマンドの出力として表示されることはありますか?
ベストアンサー1
持つ入力するの行末に$i
キャリッジリターン文字があるからですall.txt
。それはおそらくWindowsで作成されたでしょう。 Windowsは2文字のCR、LFを使用して改行を表示しますが、Unix(および世界中の他のほとんどの場所)はLF(Unixの世界では改行と同義語の改行)のみを使用するため、Unixは最後にCRがある行を確認しますしてください。
ファイルをUnix行末に変換するか、CRを削除します。
for i in $(cat $in/all.txt); do
i=${i%$'\r'}
sed -n '/price/p' ${in}/${i}/log.dat
done
行の末尾にCRがない場合は、何もしません。説明する:$'\r'
キャリッジリターン文字です。と${i%…}
i
指定したサフィックスを引いた値です。
スクリプトには、1行に1つのファイルではなくスペースで区切られた入力が必要です。入力は、ファイル名ではなくワイルドカードパターンのリストです。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?。入力にスペースやワイルドカードがない場合は、違いはありません。