ファイル内の行の一部を印刷したい。行全体は次のようになります。
Path=fy2tbaj8.default-1404984419419
Path=
の後の文字のみを印刷したい。 grep Path filename | head -5
を試しました。しかし、それは機能していません。これどうやってするの?
この目的でcut
コマンドを使用できます。
grep Path filename |cut -c6-
ここで-c6-
オプションは、6番目から最後の文字までの印刷を意味します。
grep
とgrep
のみを使用できます。
grep -oP "(?<=Path=).*" file
説明:
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正規表現のマニュアルページ を参照してください。
awk
ソリューションは私が使用するものですが、起動するわずかに小さいプロセスはsed
であり、同じ結果を生成できますが、行のPATH =部分を""
に置き換えることにより、つまり.
sed -n 's/^Path=//p' file
-n
はsed
sの「すべての行を印刷」のデフォルトの動作をオーバーライドし(したがって-n
=印刷なし)、行を印刷するには、置換の後にp
文字を追加します。 。置換が行われる行のみが印刷されます。
これにより、文字列のgrep
ingの要求された動作が得られますが、行のPath=
部分は削除されます。
David Foersterのコメントに従って、大きなファイルがあり、 'Path ='に最初に一致したものを照合して印刷したらすぐに処理を停止したい場合は、q
コマンドでsedを終了するように指示できます。 { ..}
で両方を囲み、各コマンドを;
で区切って、コマンドグループにする必要があることに注意してください。したがって、拡張コマンドは
sed -n 's/^Path=//{p;q;}` file
IHTH
GNU grepを使用:
$ echo Path=fy2tbaj8.default-1404984419419 | grep -oP '(Path=)\K.*'
fy2tbaj8.default-1404984419419
\K
は\ Kの残りを保持します。$&
に含めないでください。
grep
は、1行のテキストを取得して表示します。 head
は、文字ではなく最初のnテキスト行を表示します。
sed
またはawk
を探しています:
awk '{print $2}' FS='='
これにより、=
がフィールドセパレータとして設定され、2番目のフィールドが出力されます。
もちろん、解決策は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