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

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

新規登録して質問してみよう
ただいま回答率
85.48%
grep

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

sed

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

rpm

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

AWK

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

Q&A

解決済

3回答

3714閲覧

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

rokixenon

総合スコア12

grep

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

sed

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

rpm

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

AWK

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

0グッド

0クリップ

投稿2014/11/08 15:49

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

lang

1$ rpm -qa --queryformat="%{NAME}/%{VERSION}/%{RELEASE}/%{ARCH}\n" '^java*'

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

lang

1rpm -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スクリプトとして書いてみるとこんな感じです。(ワンライナーに改行とかインデントが入っただけですが…)

lang

1#!/bin/env perl 2use feature 'say'; 3 4while (my $target = <>) { 5 chomp $target; 6 my $dot = rindex($target, q|.|); 7 my $hyphen = rindex($target, q|-|); 8 my $hyphen2 = rindex(substr($target, 0, $hyphen), q|-|); 9 say join(q|/|, ( 10 substr($target, 0, $hyphen2), 11 substr($target, $hyphen2 + 1, $hyphen - $hyphen2 - 1), 12 substr($target, $hyphen + 1, $dot - $hyphen - 1), 13 substr($target, $dot + 1) 14 )); 15} 16 17exit 0;
  • shebang(1行目)は環境によって違うので読み替えてください。
  • chompとsayはOSの改行コードと違う改行コードを扱いたい場合にはこのままでは使えないかと思います。

投稿2014/11/09 13:04

TaMaMhyu

総合スコア1356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rokixenon

2014/11/09 13:29

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

0

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

lang

1rpm -qa | perl -pe 's#^(.*?)-([^\-]*)-([^\-]*).([^.]*)$#$1/$2/$3/$4#g'

※複数の置換が必要な場合はカンマ区切りで複数書けます。(sgの部分をカンマ区切りで追加できます。)

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

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

sedコマンドでも同じことをやってみました。

lang

1rpm -qa | sed -E 's/^(.*?)-([^\-]*)-([^\-]*).([^.]*)$/\1/\2/\3/\4/g'

投稿2014/11/09 08:21

TaMaMhyu

総合スコア1356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rokixenon

2014/11/09 11:32

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

2014/11/09 12:08

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

2014/11/09 12:16

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

2014/11/10 01:15

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

0

強引な方法ですが、次のようにして可能です。以下をご覧ください。
(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" の出力を加工する必要が発生したのでしょうか?

参考:

投稿2014/11/08 19:06

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rokixenon

2014/11/09 05:17

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

2014/11/09 09:24

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

2014/11/09 13:35

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

2014/11/09 14:09

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

2014/11/09 14:12

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問