sedを使用してファイルから1行の一部を抽出します


18

ファイルから1行の一部を読みたい。例えば:

POP3_SERVER_NAME = localhost

localhostsedを使用してのみ返されます。

このテキストは3行目にあります。私はこれをして行を抽出します:

sed -n '3p' installation.sh

localhost一部のみを抽出するにはどうすればよいですか?

回答:


26

ここではawkの方が良いツールかもしれません。

$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost

「POP3_SERVER_NAME」を含む行を検索します。最後のフィールドを印刷します。これは、POP3_SERVER_NAMEが常に行3にあることに依存していません。これはおそらく良いことです。

$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost

アプリケーションによっては、正規表現をより厳密にする必要がある場合があります。たとえば、POP3_SERVER_NAME で始まる行のみを一致させたい場合があります。

$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost

sedの使用は少し直感的ではありません。(ありがとう、私は皮肉に気づいています。)POP3_SERVER_NAMEを含む行をどこにでもアドレスします。行の先頭から「=」に続くオプションのスペースまでのすべてのテキストを空の文字列に置き換えます。次に印刷します。

sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat

2
awkコマンドはいいです-しかし、あなたは周りのスペースを持っている場合にのみ=。それは動作しませんPOP3_SERVER_NAME=localhost
マルセルStör16年

2
@Marcel、で使用されている区切り文字awkをスペースから別の何かに変更できます-F。たとえば、あなたが言及した場合に区切り文字として-F "="使用=します。
mattpr

7

p行の不要な部分を削除する置換でコマンドを置き換えます。

sed -n '3 s/^[^=]*= *//p' installation.sh

位置ではなくキーワードで行を一致させることができます。

sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh

5
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost

または、ファイルに内容がある場合:

sed 's/.*= //' somefile.txt
localhost

[OK]を、私このように私のファイルを読み込む:SED -n「3P」installation.sh
マーサー

2
@Mercer-回答に追加した更新を参照してください。
slm

@Adam Siemion-ありがとう、でも行番号をどうやって示すの?
マーサー

5

設定ファイルがあるようです。できることは、Adam Siemeon / slmが提案するものに似ています:

sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename

ここで[^=]除外全て「=」文字は、+一つ以上の文字の同じタイプの、これは実際に続いて言う=\sタブを含む任意の空白(\tおよび新しい行\n\r\nおよび普通スペース「」は、一方*の手段は、ゼロ個以上の同じタイプの、括弧は2、...、\ nは交換用のプレースホルダ、\ \ 1にマッチした文字列を配置するために内側に何をキャッチ$行の終わりを意味これは典型的な置換パターンを、次のとおりです。s/.../.../modifiers。コマンドラインオプションは、-rの略拡張されたregex構文(便宜上)および-n明示的に要求されるまで、または明示的に要求されない限り、何も出力しないことを意味しますp

次のgような修飾子を使用してグローバル検索を実行できます。

sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename  # note the space after \1

あなたがで区切られた文字列を取得すること' '(可能性があり\n\tまたは何を持っている)あなたは簡単に処理することができます。

両方の式が有効なのは、等式文字が行の最後まで続く値であり、単純な「値」から逸脱したセマンティクスを持つコメントまたは他の文字が後に続かない場合です。


編集:

他の人の投稿にはまだコメントできません。行を示すには、行番号を渡します。ケース3ではs、開始引用文字の前または前に(vimのように)渡します。

sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename

をご覧くださいinfo sed。たとえば、3.2と4.7は特に重要です。


4

cutコマンドを使用して、区切り文字を「=」に設定し、次のように2番目のフィールドを印刷できます。

cut -d'=' -f2

3

あなたのファイルが呼ばれていることを考慮して、それを行う複数の方法foobar

検索するパターンを指定します。

PAT=POP3_SERVER_NAME

を使用して抽出 sed

sed -n "/$PAT/p" foobar | sed "s/$PAT = //"

またはを使用sedしてcut

sed -n "/$PAT/p" foobar | cut -d' ' -f3

2

Linux / Unixの利点は、通常、何かを達成する方法が複数あることです。opの場合、ファイルからPOPサーバー名を抽出するには、少なくとも4つの異なる方法があります。

  1. grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
  2. grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
  3. grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
  4. sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.