「LinuxでのGNUユーティリティの効果的な使用例」

Habrコミュニティ全体にこんにちは。

これは私の最初の投稿であり、できれば最後ではありません。 したがって、あらゆる種類の欠陥、バグ、テキストの水っぽさは避けられないので、厳密に判断しないでください:)

トピック「初心者向けのコンソール」 Habrahabr.ru/blog/linux/46610.html、ISVirは 、私の意見では、想像上のスーパーを恐れることなく、アクセシブルな言語でコンソールについて新人に伝える方法を鋭く取り上げました。複雑さ。



私はISVirに匹敵するものではありません。コンソールでの作業が不可能な「毎日」の最も基本的なユーティリティのいくつかの実用的な使用についてお話しします。



だから私たちが持っているもの:



検索 -ファイルを検索します。 ファイル、ディレクトリ、シンボリックリンク、その他のファイルオブジェクトを検索できます。 find次のような多くの検索オプションを設定できます。

見つけるマナでは、残りのオプションとパラメーターについて読むことができます。



そのため、すぐに-過去24時間以内に変更された/ etc /ディレクトリ内のすべてのファイルを検索します。



$ find / etc / -type f -mtime -1



私たちが書いたものを分析しましょう:



最初のパラメーターは、常に検索の開始ディレクトリを示します。

fパラメーターを指定した-typeオプションは、通常のファイルのみを検索するようにfindに指示します。

-1パラメーターを指定した-mtimeオプションは、過去24時間以内に変更されたファイルを検索するようにfindに指示します

1の前の「-」は、範囲の上限を設定します。 「過去24時間で変更されたすべて」



1の前に「+」を指定した場合、 findは1970年1月1日から昨日(1日以上前)までに変更されたすべてのファイルを検出します。

修飾子を付けずに数値を入力することにより、正確な日付を指定することもできます。



見つかったファイルでアクションを実行します。

-execオプションは、見つかったファイルごとに実行されるコマンドを含む行を受け入れます

コマンドに渡されるパラメーターは{}で示されます

文字列は文字「\;」で終わる必要があります



例を考えてみましょう:

* / tmpディレクトリで、先月変更されたすべてのファイルを見つけて、ディレクトリにコピーします

/ tmp /バックアップ/

$ find / tmp -type f -mtime -30 -exec cp {} / tmp / backup \;



*ディレクトリの最終日に変更された名前のログを持つすべてのディレクトリを(再帰的に)削除します

/ var / www

$ find / var / www -type d -mtime 0 -name logs -exec sudo rm -fr {} \;



-typeオプションのdオプションは、ディレクトリのみが検索されることを示します

-nameオプションは、名前による検索を指定します。

ここで、この方法でファイルを削除するのは最適ではない(遅い)ことを追加する価値があります。

findには、削除のための組み込みの-deleteオプションがあり、これははるかに高速に動作します。



まだ疲れていませんか? 次へ:)



awkユーティリティを検討してください。

awkは、ファイルを処理するために設計されたプログラミング言語です。 その目的

開発-テキスト情報の処理に関連する多くの問題の定式化と解決を促進する。 実際、 awkはコンソールから利用できるユーティリティです。

明らかな理由から、ここではawkコードを記述する方法については検討しません。私たちにとって重要なテクニックについてのみ説明します。



まず、awkはSTDINからデータを受信できます: $ echo "test" | awk ...

第二に、awkはコンソールで単一行を書くのに効果的です。 パラメーターとして指定されたコードを実行します:

$ echo "test" | awk "..."



awkは入力ストリームをフィールドに分割し、これらのフィールドを$ 1、$ 2、.. $ Nの形式の変数に入れます

デフォルトでは、フィールドセパレータはスペースですが、 -F "_ separator_"オプションでこれを上書きできます:

$ head -4 / etc / passwd

ルート:x:0:0:ルート:/ルート:/ bin / bash

デーモン:x:1:1:デーモン:/ usr / sbin:/ bin / sh

bin:x:2:2:bin:/ bin:/ bin / sh

sys:x:3:3:sys:/ dev:/ bin / sh



$ cat / etc / passwd | awk -F ":" '{print $ 1}'



デーモン

ビン







たとえば、/ var / wwwディレクトリにいくつかのサイトがあります。 各サイトには、Apacheログが書き込まれるログディレクトリがあります(このサイトの場合)ここで、これらのログの総量を調べ、100Mbを超えるすべてのログを見つけます。



ここに行きます:



1.大きなログを検索します。



$ find / var / www -type f -name "access.log *" -size + 100M

/var/www/site1/logs/access.log

/var/www/site2/logs/access.log.1.gz



2.ログの合計量を計算します。



find / var / www / -type f -name "access.log *" -exec du -k {} \; | awk '{s + = $ 1} END {print s}'

5071604



だから、怖がらないでください-今私はすべてを説明します:)



findは、マスク(access.log *)によってすべてのファイルを検索し、それぞれに対してduコマンドを実行します。

duコマンドはファイルサイズを出力します。 -kオプションはキロバイト単位で出力します。

その後、 awkプロセッサが起動し、文字列(数値)の最初のフィールドを変数sに単純に合計し、変数値を画面に表示します。



別の例:システムで、ユーザーtest1に属するすべてのファイルとディレクトリを見つけて、合計ボリュームを計算します

#find / -user test1 -exec du -sm {} \; | awk '{s + = $ 1} END {print s}'



つまり ここでは、 -user findオプションを使用して、ユーザーtest1に属するファイルを検索し、各ファイル/ディレクトリのサイズを計算します(duコマンド)

さらにパイプラインを通じてawkはこのデータを受信し、上記で行ったように、Kbでの合計を考慮します。



約 今日はこれで十分だと思います。

投稿はかなり大きく、明らかに習慣ではありませんでした:)



すぐに言いたい-findとawkの使用について話すだけではなく、実際の状況での実用的なアプリケーションの例を示すことを目標に設定しました。

記事が気に入ったら-この方向で書き続けます。



お時間をいただきありがとうございます。



All Articles