私たちの日常業務では、コマンド ライン ツールを使用してテキスト データを処理する必要があることがよくあります。 Linux システムでは、bash パイプ (パイプ) は、あるコマンドの出力を別のコマンドの入力として使用できる非常に強力なツールです。しかし、パイプ経由で大きなテキスト ストリームを受信した場合、このデータを効率的に読み取ってフォーマットするにはどうすればよいでしょうか?この記事では、bash パイプを通じて受信したテキスト ストリームをより適切に処理するのに役立ついくつかの実用的なヒントと方法を紹介します。初心者でも経験豊富な開発者でも、この記事はインスピレーションと助けとなるでしょう。
現在、npmスクリプトでデータの整形をするために以下を使用しています。
リーリー 動作しますが、同僚は Linux を使用していません。そこで、Go で while ifs= read -r line;execute printf '%b\n' "$line"; Done
を実装し、パイプラインでバイナリファイルを使用したいと思います。
現在、プログラムはテキスト ストリームのすべての出力を停止します。
テール タイプの読み取りには bufio.scanner を使用したいと考えています。私見では、os.stdin
で行ったチェックは不要ですが、ymmv.
例については、この回答を参照してください。 ioutil.readall()
(現在は非推奨です。io.readall()
を使用してください) は、errors/eof を読み取りますが、入力をループしません。これが必要なものですbufio。 Scanner.scan()
理由。 p>
さらに - %b
はテキスト内のエスケープ シーケンスを変換します。たとえば、渡された行の \n
は改行としてレンダリングされます。それは必要ですか? b/c go には、同等の書式指定子がありません。
したがって、readall() に基づくアプローチは、最終的には機能する/機能する可能性があると思います。あなたが期待する動作は
bufio.scanner に似ていると思います - 受信プロセスは書き込まれたバイトを処理します (これは実際にはポーリング操作です - scan()
# を参照してください) ## 標準ライブラリのソース コードを参照して詳細を確認します) .
しかし readall()
は読み取ったものをすべてバッファリングし、最終的にエラーが発生するか eof が発生するまで戻りません。インストルメント化されたバージョンの readall()
が生成されます。
リーリー
入力を生成し、長時間実行されるものをシミュレートし、定期的にのみ書き込むための安価なスクリプトを作成しました。あなたの場合、npm がどのように動作するかを想像します。
リーリー
ところで、実際の標準ライブラリ コードを読むことは非常に役に立ちます...または、少なくともこのような場合には興味深いです。
以上がbash パイプ経由で受信したテキスト ストリームを読み取り、フォーマットするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。