質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • AWK

    85questions

    AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

  • sed

    69questions

    sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

  • grep

    39questions

    grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

  • rpm

    31questions

    rpmコマンドは、UNIX系OSのroot権限でのみ利用可能なコマンドで、 RPMパッケージのインストールなどができます。

rpm -qaの出力結果を綺麗に表示

解決済

回答 3

投稿 ・編集

  • 評価
  • クリップ 0
  • VIEW 1,913

rokixenon

score 8

はじめまして、以下の実行結果と同じ様になる方法を教えてください。

$ rpm -qa --queryformat="%{NAME}/%{VERSION}/%{RELEASE}/%{ARCH}\n" '^java*'
--queryformat を使用せず「$ rpm -qa '^java*' | ***」のようにしたいです。想像としてはgrep,split,awkなどを使用し、区切りとして後ろから○○番目の「.」や「-」を「/」に置き換えるのかなとは思うのですが。。。
まだプログラム初心者のため詳しく教えていただけると助かりますのでよろしくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

Perlのワンライナーであれば以下のようなものでできるかも知れません。

rpm -qa | perl -nle 'my $target = $_; my $dot = rindex($target, q|.|); my $hyphen = rindex($target, q|-|); my $hyphen2 = rindex(substr($target, 0, $hyphen), q|-|); print join(q|/|, (substr($target, 0, $hyphen2), substr($target, $hyphen2 + 1, $hyphen - $hyphen2 - 1), substr($target, $hyphen + 1, $dot - $hyphen - 1), substr($target, $dot + 1)));'

awkでも同じようなことはできると思います。

量が多いので、ワンライナーではなくて、スクリプトファイルにして実行した方がすっきりするとは思いますが…

参考までにPerlスクリプトとして書いてみるとこんな感じです。(ワンライナーに改行とかインデントが入っただけですが…)
#!/bin/env perl
use feature 'say';

while (my $target = <>) {
    chomp $target;
    my $dot = rindex($target, q|.|);
    my $hyphen = rindex($target, q|-|);
    my $hyphen2 = rindex(substr($target, 0, $hyphen), q|-|);
    say join(q|/|, (
        substr($target, 0, $hyphen2),
        substr($target, $hyphen2 + 1, $hyphen - $hyphen2 - 1),
        substr($target, $hyphen + 1, $dot - $hyphen - 1),
        substr($target, $dot + 1)
        ));
}

exit 0;
  • shebang(1行目)は環境によって違うので読み替えてください。
  • chompとsayはOSの改行コードと違う改行コードを扱いたい場合にはこのままでは使えないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/11/09 22:29

    スクリプトファイルにする・・・確かにその方がすっきりするかもしれませんね。TaMaMhyuさんが言われているように「状況によって最適なコマンドは違ってくる」とは理解しているのですがその引き出しが少ないのでもっと突っ込んで勉強していきたいと思います。

    キャンセル

+1

強引な方法ですが、次のようにして可能です。以下をご覧ください。
(VirtualBox 上での CentoS65 でためしています)
rpm -qa | grep '^gnu'
gnupg2-2.0.14-6.el6_4.x86_64
gnutls-2.8.5-14.el6_5.x86_64

$ rpm -qa | grep '^gnu' | tr '-' '/' | sed -e "s/\.x86_64$/\/x86_64/"
gnupg2/2.0.14/6.el6_4/x86_64
gnutls/2.8.5/14.el6_5/x86_64

rpm -qa --queryformat="%{NAME}/%{VERSION}/%{RELEASE}/%{ARCH}\n" '^gnu*'
gnupg2/2.0.14/6.el6_4/x86_64
gnutls/2.8.5/14.el6_5/x86_64

まずは rpm -qa の出力を ”−" => "/" に tr コマンドで 置換してみました。
でも それでは 最後の ".x86_64" の部分が "/x86_64" にはならなかったので、sed で置換しました。

雑談:
本来は 素の "rpm -qa" の出力を加工せずに済ます為に --queryformat が存在するのだと思います。
なぜ 素の "rpm -qa" の出力を加工する必要が発生したのでしょうか?

参考:
- RPMコマンドのqueryformatオプション http://akira-nishii.hatenablog.com/entry/2014/05/16/191701

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/11/09 14:17

    回答有り難うございます。雑談のお答えとしては今回の一例としてrpm -qaを使用しましたがgrepや置換を理解できればtxtやcsvの中身がrpm -qaの実行結果と似たような場合に流用出きるかなぁと思ったからです。
    因みにですが、行の最後が".x86_64"意外の時"i686"や"noarch"も合わせて出力される場合パイプでsedの置換を繋げる以外の方法はないでしょうか?

    キャンセル

  • 2014/11/09 18:24

    > ... "i686"や"noarch" ...

    さらに強引な方法になりますが、
    | sed -e "s/\.i686/\/i686/" | | sed -e "s/\.niarch$/\/noarch/"
    と対応するケースの置換を追加していけば良いです。

    キャンセル

  • 2014/11/09 22:35

    なる程、やっぱりパイプによる複数追加ですね。grep -eのようなものもあるのか調べてみたいと思います。有難うございました。

    キャンセル

  • 2014/11/09 23:09

    確認してませんが、
    sed -E 's/\.([^.]*)/\/\1/'
    こんな感じでできるかも知れません。
    ちなみにsedの-eオプションは複数指定できるので、パイプで多段にしなくても複数置換できると思います。

    キャンセル

  • 2014/11/09 23:12

    ちなみにgrep系のコマンドは行のフィルタ(行削除)処理なので、置換はできません。

    キャンセル

+1

perlコマンドを使っても問題なければ、以下のような感じでできるかも知れません。sedコマンドでもできるとは思いますが…

rpm -qa | perl -pe 's#^(.*?)-([^\-]*)-([^\-]*)\.([^.]*)$#$1/$2/$3/$4#g'
※複数の置換が必要な場合はカンマ区切りで複数書けます。(sgの部分をカンマ区切りで追加できます。)

ただ、状況によって最適なコマンドは違ってくるので、常に同じコマンドを使えばできるというものではないと思います。

個人的にはTSV形式にしてからawk -F '\t'で処理するというのをよくやります。

sedコマンドでも同じことをやってみました。
rpm -qa | sed -E 's/^(.*?)-([^\-]*)-([^\-]*)\.([^.]*)$/\1\/\2\/\3\/\4/g'

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/11/09 20:32

    回答有り難うございます。perlでも問題ないのですが、上記の場合だと"libreport-python-2.0.9-21.el6.centos.i686"等の場合は置換されないです。。。
    rpmの表示ルールとして後ろから1番目の「.」後ろから1番目の「-」後ろから2番目の「-」としてみたいのですが何か方法がありますでしょうか?

    キャンセル

  • 2014/11/09 21:08

    本来の目的がこれ自体ではないと言うことなので、この回答を掘り下げても意味はないとは思います。これは正規表現による置換の例として出してみたものです。
    複雑な条件がある場合は、スクリプト言語で処理を書いてしまった方が早いことが多いです。

    キャンセル

  • 2014/11/09 21:16

    一応、回答の例を修正してみました。こんな感じでしょうか。

    キャンセル

  • 2014/11/10 10:15

    sedコマンド版も追記してみました。

    キャンセル

同じタグがついた質問を見る

  • AWK

    85questions

    AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

  • sed

    69questions

    sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

  • grep

    39questions

    grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

  • rpm

    31questions

    rpmコマンドは、UNIX系OSのroot権限でのみ利用可能なコマンドで、 RPMパッケージのインストールなどができます。