GNU/Linux >> Linux の 問題 >  >> Linux

Vimマクロを使用して頻繁なタスクを自動化する

Vimでは、マクロは、特定のタスクを実行するために使用する一連のコマンドを記録できるようにする機能です。次に、そのマクロを何度も実行して、同じジョブを自動化された方法で繰り返します。

マクロは、タスクを1回だけ実行し、Vimの機能を使用してタスクを自動化することで、面倒で繰り返し可能なタスクを管理しやすくします。マクロはワークフローを改善し、時間を大幅に節約します。

この記事では、Vimマクロの概念を実際の例に適用して説明します。

問題

架空の監視システムから、ネットワーク内のホストのリストを含むCSVファイルを受け取ったとします。 /etc/hostsに変換します ホストのローカル名前解決を有効にする形式。

元のファイルは次のとおりです:

$ cat hosts.csv 
Description,Hostname,IPAddress,FQDN
"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca
"OCP Master Node 2",ocpmaster02,192.168.0.21,ocpmaster02.home.ca
"OCP Master Node 3",ocpmaster03,192.168.0.22,ocpmaster03.home.ca
"OCP Worker Node 1",ocpnode01,192.168.0.30,ocpnode01.home.ca
"OCP Worker Node 2",ocpnode02,192.168.0.31,ocpnode02.home.ca
"OCP Worker Node 3",ocpnode03,192.168.0.32,ocpnode03.home.ca
"Ansible Host 1",ansibleh01,192.168.0.144,ansibleh01.home.ca
"Ansible Host 2",ansibleh02,192.168.0.145,ansibleh02.home.ca

期待される出力は次のとおりです:

192.168.0.20    ocpmaster01.home.ca    ocpmaster01    #OCP Master Node 1
192.168.0.21    ocpmaster02.home.ca    ocpmaster02    #OCP Master Node 2
192.168.0.22    ocpmaster03.home.ca    ocpmaster03    #OCP Master Node 3
192.168.0.30    ocpnode01.home.ca    ocpnode01    #OCP Worker Node 1
192.168.0.31    ocpnode02.home.ca    ocpnode02    #OCP Worker Node 2
192.168.0.32    ocpnode03.home.ca    ocpnode03    #OCP Worker Node 3
192.168.0.144    ansibleh01.home.ca    ansibleh01    #Ansible Host 1
192.168.0.145    ansibleh02.home.ca    ansibleh02    #Ansible Host 2

期待どおりの出力を得るには、一部のフィールドの位置を切り替え、引用符を削除し、タブ文字またはコメント文字()を挿入して、入力を編集する必要があります。 )適切に。このタスクを処理するためにVimマクロを使用してみましょう。

問題を解決してマクロを記録する

Vimマクロの基本的なワークフローは、最初の行で問題を解決するために必要な編集を行いながらコマンドとキーストロークを記録し、コマンドシーケンスをレジスタに保存してから、マクロを再生して残りの行で同じことを行うことで構成されます。

マクロを記録してレジスタに保存するには、キー qを入力します aからの手紙が続きます zへ これは、マクロを保存するためのレジスタを表し、その後に記録するすべてのコマンドが続き、キー qを入力します。 もう一度録音を停止します。

q<register><commands>q

たとえば、新しい行を挿入する基本的なマクロを記録し、それを保存して aを登録します。 、次のシーケンスを使用します:

qao<ESC>q

このマクロは役に立ちませんが、他のマクロを記録するために必要なシーケンスを例示しています。

Vimでマクロを記録することは、ロジックの演習であり、Vimコマンドを適切に使用します。入力が多少異なる場合でも、このマクロを他の行で繰り返し可能にする必要があることに注意してください。たとえば、コマンド dwを使用するのが最適です。 コマンドxを繰り返すのではなく、単語を削除する 単語の文字数は行ごとに異なる可能性があるため、文字を削除します。

それでは、CSVファイルの最初の行を必要な形式に変換するマクロを記録して、レジスター hに保存しましょう。 。ファイル内の変更する最初の行の任意の場所にカーソルを置くことから始めます。

"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca

次に、 qを押してマクロの記録を開始します およびh hを登録するために保存します :

qh

マクロを記録している間、下部のステータス行に次のメッセージが表示されます:

recording @h

次に、キャラクターを既知の位置に移動することをお勧めします。これにより、マクロの開始時にカーソルが置かれていた場所に関係なく、マクロが同じように機能します。 0 を押して、線の始点を始点として使用しましょう。 :

0

この最初のフィールドは説明であり、出力の行末のコメントになります。そこにいる間に、引用符を"に置き換えます コメント文字付きの文字 、したがって、後でこのフィールドを行の終わりに移動するときにこれを行う必要はありません:

r#

次に、 f を使用してカーソルを次の引用符に移動し、次の引用符を削除します。 コマンドを押してxを押します 削除するには:

f"x

この時点で、最初の行は次のようになります。

#OCP Master Node 1,ocpmaster01,192.168.0.20,ocpmaster01.home.ca

次に、 l を使用して、カーソルを1つ右に移動します。 、次のカンマまでホスト名全体を削除します:

ldf,

Vimでテキストを削除するときは、それもコピーすることを忘れないでください。それでは、行の最後に貼り付けましょう。 A を使用して、最後にテキストを挿入します カンマを挿入して、 pを押します ホスト名を貼り付けるには:

A,<ESC>p

これで、フィールドはほぼ希望の順序になりました。コメントを行末に移動しましょう。これを行うには、カーソルを 0で始まる先頭に戻します。 、 df、を使用して、コメント全体を次のカンマまで削除します :

0df,

次に、 $を使用してカーソルを行末に移動します 、 pでテキストを貼り付けます 、 xで最後のカンマを削除します :

$px

これで、すべてのフィールドが目的の位置に配置され、行は次のようになります。

192.168.0.20,ocpmaster01.home.ca,ocpmaster01,#OCP Master Node 1

最後に、 s を使用して、すべてのカンマをタブ文字に置き換えます コマンド:

:s/,/\t/g<ENTER>

行は目的の出力と一致します:

192.168.0.20    ocpmaster01.home.ca     ocpmaster01     #OCP Master Node 1

j を押してカーソルを次の行に移動し、マクロを終了します。 したがって、マクロを繰り返し使用できます。最後に、 qを押して録音を停止します :

jq

マクロを記録し、使用する準備が整いました。次に確認する方法を見てみましょう。

マクロの表示と読み込み

マクロはVimレジスタに保存されるため、コマンド:reg を使用して、保存されたマクロを表示できます。 すべてのレジスタの内容を確認するには:

:reg
--- Registers ---
""   ,
"h   0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj
"-   ,
...

特定のレジスター、この場合はレジスター h、を確認することもできます。 :regへのパラメータとして提供します コマンド:

:reg h
--- Registers ---
"h   0r#f"xldf,A,^[p0df,$px:s/,/\t/g^Mj

両方の方法を使用して、レジスタ hの内容を確認できます。 以前に記録したマクロと一致します。 ESCのような特殊文字に注意してください およびENTER Vim表現に置き換えられました^[ および^M それぞれ。

マクロをレジスタにロードすることもできます。まず、マクロの内容をコピーして、バッファの空の行に貼り付けます。次に、 Ctrl + v + を使用して、特殊文字をVim表現に置き換えます。 およびCtrl+ v + 挿入モード。次に、マクロの内容を目的のレジスタにコピーします。たとえば、レジ​​スタ h このコマンドで:

"hy$

次に、マクロを再生して、ファイルの残りの行を更新しましょう。

再生マクロ

マクロを記録してその内容を確認したら、マクロを使用して残りの行で同じ編集を実行します。

マクロを1回再生するには、カーソルを次の行に移動して @hを押します。 ここでh マクロを保存したレジスタを表します。

マクロは、必要に応じてカーソルを次の行に自動的に移動することに注意してください。これにより、実行を繰り返すことができます。マクロの実行を繰り返すには、 @@を押します。 。

最後に、Vim number を使用して、残りのすべての行でマクロを繰り返すことができます。 構文。たとえば、残りの5行でマクロを実行するには、 5 @@を押します。 または5@ h

これは、マクロを実行する回数が正確にわかっている場合にうまく機能します。代わりに、ファイルの終わりまですべての行でマクロを実行する場合は、存在する行数に関係なく、次の構文を使用します。

:%:normal @h

これで、ファイル内のすべての行が期待される出力と一致します。変更を完了するには、最初のタイトル行を削除します。

次は何ですか?

Vimマクロは、Vimの機能を拡張し、複雑なタスクをすばやく実行できる強力なリソースです。

8行のファイルでマクロを実行する利点を確認できます。数百または数千のエントリを含むファイルで同様のことを行う必要がある場合を想像してみてください。これらの8行をコピーして何百回も貼り付けてから、マクロを再適用することで、これをテストすることもできます。

数千行のファイルでマクロを使用している場合は、 set lazyredrawをご覧ください。 パフォーマンスを向上させるコマンド。この設定により、Vimはマクロの反復ごとに画面を再描画できなくなります。

Vimマクロを作成するには、最適化された方法でタスクを考えて実行する必要があります。 Vimを使用して、タスクを繰り返し可能にし、必要に応じてマクロに変換できるようにする方法を考えるのは良い練習です。

これを行うことで、Vimに習熟し、その見返りとして、ワークフローを改善して時間を節約するためのより高度な機能を利用できるようになります。

[Vimについてもっと知りたいですか?この無料のVimチートシートをダウンロードしてください。 ]


Linux
  1. sipcalcLinuxコマンドラインツールの使用方法

  2. 再帰的なVimマクロ:反復的なタスクを自動化するためのさらに一歩

  3. Linuxのネットワークでライブホストを検出する

  1. エイリアスコマンドで`which`を使用する方法は?

  2. vimでpylintを使用する方法

  3. 別のユーザーの .vimrc と .vim/ を使用する

  1. (ターミナルベースの)Vimでメニューを作成して使用することは可能ですか?

  2. Vimでファイルタイプを使用する方法は?

  3. 膨大な量の TIME_WAIT 接続で netstat が表示される