
私たちは次のスクリプトを使います:
more test.sh
#!/bin/bash
while read -r line
do
echo $line
done < /tmp/file
ファイルは次のようになります。
kafka-broker,log.retention.hours,12
kafka-broker,default.replication.factor,2
fefolp-defaults,fefolp.history.fs.cleaner.interval,1d
fefolp-defaults,fefolp.history.fs.cleaner.maxAge,2d
fefolp-env,fefolp_daemon_memory,10000
blo-site,blo.nodemanager.localizer.cache.target-size-mb,10240
blo-site,blo.nodemanager.localizer.cache.cleanup.interval-ms,300000
ams-env,metrics_collector_heapsize,512
fefolp,hbase_master_heapsize,1408
fefolp,hbase_regionserver_heapsize,512
fefolp,hbase_master_xmn_size,192
core-site,blolp.proxyuser.ambari.hosts,*
core-site,Hadoop.proxyuser.root.groups,*
core-site,Hadoop.proxyuser.root.hosts,*
blo-site,blo.scheduler.minimum-allocation-mb,1024
blolp-env,fefolp_heapsize,4096
注 - 最後の行の後にスペースはありません!
ただし、スクリプトは次の行のみを印刷します(最後の行を除く)。
./test.sh
kafka-broker,log.retention.hours,12
kafka-broker,default.replication.factor,2
fefolp-defaults,fefolp.history.fs.cleaner.interval,1d
fefolp-defaults,fefolp.history.fs.cleaner.maxAge,2d
fefolp-env,fefolp_daemon_memory,10000
blo-site,blo.nodemanager.localizer.cache.target-size-mb,140
blo-site,blo.nodemanager.localizer.cache.cleanup.interval-ms,300
ams-env,metrics_collector_heapsize,51
fefolp,hbase_master_heapsize,1408
fefolp,hbase_regionserver_heapsize,542
fefolp,hbase_master_xmn_size,19
core-site,blolp.proxyuser.ambari.hosts,*
core-site,Hadoop.proxyuser.root.groups,*
core-site,Hadoop.proxyuser.root.hosts,*
blo-site,blo.scheduler.minimum-allocation-mb,1024
なぜこれが起こるのですか?
答え1
入力テキストの最後の行に不完全な行があります。最後の行は改行文字で終わりません。
while IFS= read -r line || [ -n "$line" ]; do
printf '%s\n' "$line"
done <file
上記のループは、呼び出されたファイルから未変更の行を読み取り(空白を削除したりバックスラッシュ制御シーケンスを解釈したりせず)、file
それを標準出力として出力します。
いつ不完全read
行の読み取りは失敗しますが、$line
まだデータが含まれています。追加の-n
テストでは、これを検出してループ本体が不完全な行を出力できるようにします。その後の反復では、空の文字列でread
再び失敗し、ループが終了します。$line
シェルにNUL文字が含まれておらず、シェルで有効な文字の一部をzsh
形成しないバイトシーケンスが含まれていないと仮定すると、入力yash
が有効なテキストであればどちらも発生しません。最後の行文字の行の区切りによって無効なテキストになりました。
答え2
while読み取りループへの入力は、次のように完了する必要があります。
cat /tmp/file | { cat ; echo ; } | while read -r line; do echo $line; done
これにより、最後の行を含むすべての行が処理されます。
ソース:私のオープンソースプロジェクトhttps://sourceforge.net/projects/command-output-to-html-table/
答え3
次のような入力テキストの最後の行に不完全な行があります。最後の行は改行文字で終わりません。ループを同じままにし、変数行に戻り値があることを確認してください。
while read -r i
do
#
line="$(echo "$i"| sed 's/$/@/'| tr '\n' '@'|sed 's/@@/@/' |tr '@' '\n')"
#
echo $line
#
done < /tmp/file
@
必要なものに変更できます。