web-dev-qa-db-ja.com

検索された文字列を表示しないようにgrepをコマンドする方法は?

ファイル内の行の一部を印刷したい。行全体は次のようになります。

Path=fy2tbaj8.default-1404984419419

Path=の後の文字のみを印刷したい。 grep Path filename | head -5を試しました。しかし、それは機能していません。これどうやってするの?

8
Anandu M Das

この目的でcutコマンドを使用できます。

grep Path filename |cut -c6-

ここで-c6-オプションは、6番目から最後の文字までの印刷を意味します。

12
g_p

grepgrepのみを使用できます。

grep -oP "(?<=Path=).*" file

enter image description here

説明

man grepから:

   -o, --only-matching
          Print only the matched (non-empty) parts of a matching line,
          with each such part on a separate output line.
   -P, --Perl-regexp
          Interpret PATTERN as a Perl compatible regular expression (PCRE)

lookbehind(?<=Path=)は、文字列の現在の位置で、先行するのは文字Path=であることを表明します。アサーションが成功した場合、エンジンは解決パターンと一致します。

Perl 5の正規表現の構文については、 Perl正規表現のマニュアルページ を参照してください。

31
Sylvain Pineau

awkソリューションは私が使用するものですが、起動するわずかに小さいプロセスはsedであり、同じ結果を生成できますが、行のPATH =部分を""に置き換えることにより、つまり.

  sed -n 's/^Path=//p' file

-nsedsの「すべての行を印刷」のデフォルトの動作をオーバーライドし(したがって-n =印刷なし)、行を印刷するには、置換の後にp文字を追加します。 。置換が行われる行のみが印刷されます。

これにより、文字列のgrepingの要求された動作が得られますが、行のPath=部分は削除されます。

David Foersterのコメントに従って、大きなファイルがあり、 'Path ='に最初に一致したものを照合して印刷したらすぐに処理を停止したい場合は、qコマンドでsedを終了するように指示できます。 { ..}で両方を囲み、各コマンドを;で区切って、コマンドグループにする必要があることに注意してください。したがって、拡張コマンドは

sed -n 's/^Path=//{p;q;}` file

IHTH

6
shellter

GNU grepを使用:

$ echo Path=fy2tbaj8.default-1404984419419 | grep -oP '(Path=)\K.*'
fy2tbaj8.default-1404984419419

\Kは\ Kの残りを保持します。$&に含めないでください。

5
cuonglm

grepは、1行のテキストを取得して表示します。 headは、文字ではなく最初のnテキスト行を表示します。

sedまたはawkを探しています:

awk '{print $2}' FS='='

これにより、=がフィールドセパレータとして設定され、2番目のフィールドが出力されます。

5
Jan

もちろん、解決策はgrep -Poを使用することです。

完全を期すために、いくつかの他のソリューションを追加しましょう。

  • cutを使用して、区切り文字を=に設定します。

    cut -d'=' -f2 file
    
  • 少し危険かもしれませんが、 ソース ファイルを使用して、$Pathに値を含めることもできます。

    source file
    echo "$Path"
    

テスト

$ cat a
this=aaabbccc
that=dddeee
$ source a
$ echo "$this"
aaabbccc
$ echo "$that"
dddeee

コメントに従って、ファイルの一部をsourceする方法を参照してください。

$ cat a
Path=22
Path=33
$ source a
$ echo $Path
33
$ source <(head -1 a)
$ echo $Path
22
1
fedorqui