私はsedとawkを学ぶ前にbashを最初に学びました。人々はsed、awk、時にはgrepを使って多くのことをするのを見ましたが、bashロジックでしか実行できないようです。私は考えています既にbashスクリプターである人が学ぶのに役立つsedとawkのユースケースは何ですか?sedとawkを完全に理解していないと、それを決定するのは難しいです。
答え1
すでに手と膝で歯車する方法を知っていますが、自動車の運転方法を学ぶことが何を意味するのかと尋ねるのと似ています。はい、bashは基本的なテキスト操作や単純な数学に乱用される可能性がありますが、最も遅いツールであり、構文が複雑でエラーが発生しやすいです。また、bashを含むシェルは浮動小数点操作を実行できないため、シェルのみを使用して実行できる操作は大幅に制限されます。
これらの理由の1つで十分ですが、次は非常に簡単な例です。 1から100,000までの数字がランダムな順序で混在したファイルを取得します。
seq 100000 | shuf > file
それでは、すべての奇数を選択してみましょう。 Bashでは、次のことができます。
$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile
real 0m3.481s
user 0m2.648s
sys 0m0.801s
マイコンピュータでは約3秒かかります。同じことをしましたが、数字が1から1,000,000の間の場合はどうなりますか?
seq 1000000 | shuf > file
そして:
$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile
real 0m32.483s
user 0m25.035s
sys 0m7.343s
すでに30秒以上でした!それでは、awk
同じ内容を正しい数学で比較してみましょう。
$ time awk '$1 % 2 !=0' file > newfile
real 0m0.344s
user 0m0.340s
sys 0m0.003s
1秒も残りませんでした。同じテキストマッチング方法を使用するsedはどうですか?
$ time sed -n '/[13579]$/p' file > newfile
real 0m0.280s
user 0m0.273s
sys 0m0.007s
1秒も過ぎず、こういうことが再び起こりました。では10,000,000に増やしたらどうでしょうか?
$ seq 1000000 | shuf > file
$ time awk '$1 % 2 !=0' file > newfile
real 0m4.081s
user 0m3.896s
sys 0m0.090s
$ time sed -n '/[13579]$/p' file > newfile
real 0m2.898s
user 0m2.683s
sys 0m0.111s
$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile1
real 5m42.445s
user 4m25.687s
sys 1m15.241s
ご覧のとおり、シェルソリューションはビシェルソリューションよりはるかに遅いです。そして、千万行のファイルは特に珍しいものではありません。これは76Mテキストファイルです。さらに、両方のビシェルソリューションは、文字の長さの点ではるかに短く、構文を理解するとはるかに簡単です。
つまり、「あなたが持っているのがハンマーだけなら、すべてが釘のように見える」という事例です。はい、bashはsed
orなどのツールを使用して実行できるいくつかの操作を実行できますが、はるかにawk
遅く、正しく実行されません。