出力の特定の部分を印刷します


11

次のようなコマンドがあると仮定します。

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG

出力は次のとおりです。

CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

さて、私の質問は次のとおりです。逆コンマの内側にあるものだけを出力するコマンドはあります" "か?

コマンドについて少し説明してもらえますか?ありがとうございました!あらかじめ。


5
catパイプでの使用は、ほとんどの場合リソースの浪費(別名UUOC)であることに注意してください。grep既にファイルから入力を読み取ることができます(つまり、grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-genericまったく同じことを行いますが、1。短くなります。2。理解しやすくなります。3。追加のシェルと追加のプロセスをフォークしません)。99%のケースでは、複数のファイルを連結せずにパイプの先頭でcatを使用するだけで有害です。:)
コス

@kos-ありがとう!Linuxを使い始めたばかりなので、それを知りませんでした。覚えておいてください。
ラファエル

Np!この質問に出くわした他の人のために、上記のコメントを残しています。
コス

catこの場合は役に立たないが、最初は、後で何かを変更/追加/削除したい場合に、コマンド行全体を編集するのが簡単になります。おそらく、trまたはcutなど、ファイル名を見つけて移動する必要はありません、他のコマンドがそれをサポートしていることを確認し、どこに置くかなどを見つけてください。また、小さなテストファイルの場合、追加されるのは0.002秒だけです。(私はおそらく私が今まで余分回避の一生の間に節約できますよりも、これを入力してより多くの時間を費やしてきたcatのを)
Xen2050

1
@ Xen2050なぜcatここで助けになるのですか?あなたがすることができますgrep foo file | trまたはと... | cut同じくらい簡単にcat file | tr | grep ...catただ、余分な5つの文字、余分なパイプと余分なプログラム呼び出しを追加し、簡素化は何もしません。
テルドン

回答:


15

はい、できます。あなたのコマンドは次のようになります:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG | awk -F'"' '{print $2}'

のみを返します:

arch/x86/configs/x86_64_defconfig

このawkコマンドは、-Fコマンドでフィールド区切り文字を使用します。二重引用符を使用するように設定するには、のように単一引用符で囲んで入力し-F'"'ます。次に、'{print $2}'フィールド区切り文字の後に2番目のセットを印刷するようにawkに指示します。

お役に立てれば!


14
@Terrance、この場合、これはcatandの無用な使用ですgrep。あなたは置き換えることができますcatし、grepとの一部awk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic 。AWKをさせるより少ない配管は、それがより行うことが可能であるよりも、すべての作業、やる
Sergiy Kolodyazhnyy

@Serg
Tung Tran

@Serg問題ありません。私はあなたが言っていることを理解しています。私は彼の元のコマンドにコマンドを追加するだけで追加していましたawk。=)
テレンス

11

単一のgrepコマンドでそれを行うことができます:

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-3.19.0-32-generic

または(もう少し長く、よりよく考えられます):

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -PgrepパターンをPCRE(Perl Compatible Regular Expression)として解釈するよう指示します。
  • -ogrep一致のみを印刷するように指示します。
  • ^CONFIG_ARCH_DEFCONFIG="CONFIG_ARCH_DEFCONFIG="行の先頭の文字列に一致します。
  • \K:以前に一致した部分文字列を破棄します。

#1:

  • [^"]*:("貪欲ではない)任意の文字の任意の数と一致します。

#2:

  • .*?:任意の数の任意の文字に一致します(怠lazに)。
  • (?="):先読み(長さゼロのアサーション、どの文字とも一致しません); 次の文字がの場合に一致します"
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig

同じ結果を達成するために、複数の方法を学ぶことが大好きです。素晴らしい答えです!=)
テランス

10

この猫の皮を剥ぐ方法はたくさんありますが、ここに方法がありますsed

sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.19.0-32-generic

ここでは、行を照合し、目的の部分、つまり二重引用符で囲まれた部分(([^"]+))をキャプチャしてから、行全体をキャプチャしたグループ(\1)のみで置き換えます。

例:

% sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.13.0-32-generic
arch/x86/configs/x86_64_defconfig

10

なにperl

grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic | 
    perl -pe 's/.*?"([^"]*).*/$1/'

perl-pで指定したスクリプトを適用した後、すべての行をRINT -es/foo/bar/代用しますfoobar。括弧内のパターン「捕獲」されていると呼ぶことができる$1$2... $Nどこ$1第一のパターンが捕獲され、$2第二などの正規表現は、(最初の引用符までのすべてを探しますが.*?")、その後、0以上の非キャプチャ"の文字を([^"]*)そして、他のすべて。全体がキャプチャされたパターンに置き換えられます。

パターンマッチングをperl次のように残すこともできます。

perl -ne 's/.*CONFIG_ARCH_DEFCONFIG="([^"]*).*/$1/ && print' /boot/config-3.19.0-32-generic

2
ある時点で参加することはわかっていました:P +1
heemayl

その後、私は、Pythonのコード..生じるであろう
のAvinashラジ

with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]
アビナッシュラジ

@AvinashRaj良いもの、これを投稿してください?私も正規表現を使用して投稿しました。
セルギーKolodyazhnyy

8

ここでの組み合わせですgrepcut同じ仕事をしていません。

$ grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic | cut -d"\"" -f2                                                
arch/x86/configs/x86_64_defconfig

説明:

  • grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-genericは、標準のgrep構文で、行を見つける部分ですgrep [OPTIONS] PATTERN [FILE...]。出力はパイプを通って次のステージに進みます
  • cut -d"\"" -f2。この部分は、切り取りを使用して、特定の区切り文字(-dフラグで指定)で区切られたテキストを切り取ります。シェルがcutシェル自体への入力ではなく、コマンドのオプションの1つとして二重引用符を使用できるように、二重引用符をバックスラッシュでエスケープする必要があります。今cutからの出力を扱いますgrep区切って"3つの列へと分割CONFIG_ARCH_DEFCONFIGarch/x86/configs/x86_64_defconfigおよび空きスペース。必要な行は2番目の列です。つまり、-f2フラグを使用する必要があります。

3

現在pythonここで学んでいるので、まさにそれを使用したバージョンです。

#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

サンプル実行:

DIR:/TECH-BOOKS
skolodya@ubuntu:$ ./extractString.py                                           
arch/x86/configs/x86_64_defconfig

DIR:/TECH-BOOKS
skolodya@ubuntu:$ cat ./extractString.py                                       
#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

インデントは.. very7 Pythonで非常に重要である
のAvinashラジ

1
あなたは、ちょうどすなわち地雷を使用し、regexdのために行く必要がないline.startswithので、re.matchよりはるかに遅いですstartswith
のAvinashラジ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.