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

Linuxtacコマンドの使用を開始する

tac コマンドは基本的にです コマンドですが、その目的はファイルを逆に連結することです。 のように 、標準出力に印刷するための便利なフォールバックモードがあります (STDOUT)出力ファイルが提供されていない場合は、 less のように、レイジーページャーとしてより頻繁に使用されるコマンドの1つになります。 および詳細 —名前が付けられた関数よりも。

コマンドは頻繁に乱用され、悪用され、 tac 多くの場合、 ddateのようなジョークコマンドと見なされます またはcowsay 。エイプリルフールの記事で、愚かな端末のトリックを詳しく説明していることがよくあります。ですから、タックというのは驚きかもしれません。 実際に存在する正当な理由があります。

これは実際には便利なコマンドです。

tacの目的は何ですか?

タック マニュアルページは、それ自体の機能を説明するのにかなり貧弱な仕事をしています:

Write each FILE to standard output, last line first.

書かれているとおりにその声明をとって、タック ファイルの最後の行を印刷してから、1行目からファイルを印刷する必要があります:

$ cat metasyntactic.list
foobar
foo
bar
baz

$ tac metasyntactic.list
baz
foobar
foo
bar

しかし、それはそれがすることではありません。その情報ページははるかに明確です:

copies each FILE (‘-’ means standard input), 
or standard input if none are given,
to standard output, reversing the records
(lines by default) in each separately.

例:

$ tac metasyntactic.list
baz
bar
foo
foobar

tacという事実を無視する すべてを逆にすると、驚くほど便利でユニークなオプションがいくつかあります。

タックとセパレーター

情報ページに示されているように、ファイルを行で区切る必要はありません。つまり、 tac たとえば、CSVファイルでも同様に効果的です。 -separatorを使用してファイルの区切り文字を定義します または-s オプション、およびファイルで使用される区切り文字。

CSVファイルの場合、文字はおそらくカンマ()です。 )、ただし、任意の文字を定義できます。ただし、ファイルが区切り文字で終わっていない場合は、予期しない結果が発生します。

$ tac --separator="," metasyntactic.csv
bazbar,foo,foobar

最初の2つの項目の間に区切り文字はありません。ファイルの最終レコード(最後の区切り文字に続く文字列、この場合はコンマ)自体の後にコンマが続くわけではないため、 tacでは非レコードとして扱われます。 。この問題を説明するには、-beforeを使用します または-b 各レコードの前に区切り文字を配置するオプション:

$ tac --separator="," --before metasyntactic.csv
baz,bar,foo,foobar

区切り文字は単一文字である必要はありません。正規表現(regex)にすることもできます。

タックと正規表現

正規表現の完全な説明はこの記事の範囲外ですが、拡張POSIXは環境変数によってサポートされていることに言及する価値があります。拡張正規表現は、正規表現の読みやすさを大幅に向上させます。簡単にするために、この例ではこれを使用しています。すべて整数で区切られた文字列を含むファイルがあるとします。

$ cat metasyntactic.txt
foobar123foo456bar789baz898

その他のLinuxリソース

  • Linuxコマンドのチートシート
  • 高度なLinuxコマンドのチートシート
  • 無料のオンラインコース:RHELの技術概要
  • Linuxネットワーキングのチートシート
  • SELinuxチートシート
  • Linuxの一般的なコマンドのチートシート
  • Linuxコンテナとは何ですか?
  • 最新のLinux記事

気になる文字列が整数で区切られていることは確実に予測できますが、それらの整数がどうなるかを確実に予測することはできません。それがまさに正規表現が解決しようとしている問題です。

タックで正規表現を使用するには コマンドで、-regexを使用します または-r -セパレータの前のオプション 意味。また、環境にすでに設定されていない限り、 REG_EXTENDEDをアクティブ化する必要があります 環境変数。この変数をゼロ以外に設定してアクティブにすることができ、通常のすべての方法でそれを行うことができます。

  • 使用しているシェルセッションの変数をエクスポートします。
  • シェル構成ファイル(〜/ .bashrc など)で環境変数を設定します 。
  • 環境変数をtacに追加します 以下の例に示すように、コマンド(Bash、Zshなど):
$ REG_EXTENDED=1 tac --regex \
--separator='[0-9]+' metasyntactic.txt
89baz898bar765foo432foobar1

ただし、-before を使用しても、正規表現オプションは終了していないレコードを適切に処理しません。 オプション。その機能が重要な場合は、ソースファイルを調整する必要があるかもしれません。

tacを使用する場合

これらのシンプルでありながら便利な解析オプションにより、 tac 単純で最小限の解析コマンドとして使用する価値があります。 tac のAWKまたはPerl式を作成する価値があまりない単純なジョブの場合、 賢明な解決策かもしれません。

タック コマンドは、レコードを元に戻す以外の方法でレコードを操作しないため、明らかに制限されています。ただし、必要なリスト操作はそれだけである場合もあります。

たとえば、配布用にソフトウェアをパッケージ化する場合、インストールに必要な依存関係のリストがあることは珍しくありません。このリストをどのように収集したかによっては、依存関係をインストールする必要がある順序ではなく、依存関係を確立した順序でリストを作成することができます。

コンパイラエラーが最初に高レベルの依存関係に影響を与えるため、この方法は比較的一般的です。つまり、システムに libavcodecがない場合 その後、GCCは停止し、警告を発します。ただし、GCCはシステムで libvorbisをプローブする機会がないためです。 およびlibvpx たとえば、これらの依存関係も欠落していることはわかりません(また、多くの場合、 libavcodecをコンパイルする前にシステムに存在している必要があります 。

したがって、依存関係のリストは、システムがライブラリに必要なライブラリを構築するために必要なライブラリ(など)を見つけると、トップダウン形式で増えていきます。このようなプロセスの最後に、 tac そのリストを逆にするための迅速で簡単な方法です。

もう1つの一般的な煩わしさは、ログファイルです。エントリは通常、ログファイルに追加されるため、管理者はテールを使用します 最新のエラーを確認します。これはうまく機能しますが、どこまで戻る必要があるかを知らずに、エントリの「チャンク」を見たい場合があります。 タック 少ないにパイプされたコマンド またはもっと 画面の上部に最新のエントリを表示します。

最後に、多くの構成ファイルには、特定のセクションの明確な終了マーカーがありません。 awkを検索できます およびsed 構成ファイル内のブロックがいつ終了するかを判断する方法を考案するコマンド、または tacを使用できます パーサーがそのブロック内の最初の関連エントリを見つけると、停止するタイミングも認識できるように、順序を逆にします。 以前はヘッダーだったものがフッターになっているためです。

タックオン

tacの優れた用途は他にもたくさんあります 、そしておそらくタックする理由の束 初歩的すぎて解決策にはなりません。ただし、システムにインストールされている可能性が高いため、次にワークフローで実際にタックする必要があるエッジケースを見つけたときに、このコマンドを覚えておいてください。 逆にケッド。


Linux
  1. statコマンドを使用してLinuxのファイルステータスを確認します

  2. Linuxcatコマンドの使用を開始する

  3. lsの使用を開始する

  1. findコマンドを使用してLinux上のファイルとディレクトリを検索します

  2. Linuxでの並べ替えコマンドと例

  3. LinuxでPostgreSQLを使い始める

  1. GNOMELinuxデスクトップの使用を開始する

  2. LinuxでSSHを使い始める

  3. Linuxでのファイルコマンドの基本的な例