ホームページ  >  記事  >  バックエンド開発  >  bash パイプ経由で受信したテキスト ストリームを読み取り、フォーマットするにはどうすればよいですか?

bash パイプ経由で受信したテキスト ストリームを読み取り、フォーマットするにはどうすればよいですか?

WBOY
WBOY転載
2024-02-10 23:30:09514ブラウズ

如何读取和格式化通过 bash 管道接收的文本流?

私たちの日常業務では、コマンド ライン ツールを使用してテキスト データを処理する必要があることがよくあります。 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()

(標準ライブラリのソース コードの正確なコピーで、インストルメンテーション出力が少しだけ追加されています) をクラックしたところ、バイトの書き込みと同時に読み取りが行われていることがわかります。書き込みプロセスが完了するまでコンテンツを返したり生成したりすることはなく、その時点でパイプの終わり (開いているファイル ハンドル) が閉じられるため、eof:

が生成されます。 リーリー 入力を生成し、長時間実行されるものをシミュレートし、定期的にのみ書き込むための安価なスクリプトを作成しました。あなたの場合、npm がどのように動作するかを想像します。 リーリー ところで、実際の標準ライブラリ コードを読むことは非常に役に立ちます...または、少なくともこのような場合には興味深いです。

以上がbash パイプ経由で受信したテキスト ストリームを読み取り、フォーマットするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。