sedコマンドを使用して、テキストファイルの最初の列と最後の列のみを表示する方法を理解するのに役立ちます。これまでの私の最初の列は次のとおりです。
cat logfile | sed 's/\|/ /'|awk '{print $1}'
最後の列も表示したい私の弱い試みは次のとおりです。
cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
ただし、これは最初の列と最後の列を取り、1つのリストにマージします。 sedコマンドとawkコマンドを使用して最初の列と最後の列を明確に印刷する方法はありますか?
入力例:
foo|dog|cat|mouse|lion|ox|tiger|bar
答え1
そこくらいです。 2つの列参照を1つにまとめるだけです。
cat logfile | sed 's/|/ /' | awk '{print $1, $8}'
また、ここでは必須ではありませんcat
。
sed 's/|/ /' logfile | awk '{print $1, $8}'
awk
また、列区切り文字は|
空白ではなく、どちらも必要ないことがわかりますsed
。
awk -F '|' '{print $1, $8}' logfile
~によると提案渡すガレブ、正確に8でなくても、最後のフィールドを出力するソリューションが必要な場合に使用できます$NF
。
awk -F '|' '{print $1, $NF}' logfile
また|
、出力でスペースを使用する代わりに区切り文字を保持したい場合は、出力フィールド区切り文字を指定できます。残念ながら、単にフラグを使用するよりも少し厄介ですが-F
、これを行う3つの方法があります。
awk
BEGINブロックに入力フィールドと出力フィールドの区切り文字自体を割り当てることができます。awk 'BEGIN {FS = OFS = "|"} {print $1, $8}' logfile
awk
コマンドラインから呼び出すと、フラグを使用してこれらの変数を割り当てることができます-v
。awk -v 'FS=|' -v 'OFS=|' '{print $1, $8}' logfile
または簡単に:
awk -F '|' '{print $1 "|" $8}' logfile
答え2
awk
とにかく、あなたは以下を使用しています:
awk '{ print $1, $NF }' file
答え3
最初から最後まで(または必要に応じて空白)に|
置き換えます。|
sed 's/|.*|/|/'
sed
特別な実装はありません|
が(拡大する-E
一部の実装では、正規表現はアクティブではありません-r
。\|
これはGNUなどの実装ではそれ自体が特別ですsed
。だからあなたはしなければなりません。いいえ|
文字と一致させるにはエスケープします|
。
スペースに置き換えると、入力にすでに1つしか含まれていない行が含まれる可能性があり、一致しないため、特に|
処理する必要があります。|.*|
それは次のとおりです。
sed 's/|\(.*|\)\{0,1\}/ /'
(該当部分がオプションになる場合でも.*|
) または:
sed 's/|.*|/ /;s/|/ /'
または:
sed 's/\([^|]*\).*|/\1 /'
入力のフィールド数に関係なく、最初と8番目のフィールドが必要な場合は、次のようにします。
cut -d'|' -f1,8
(これはすべて、入力が有効なテキスト形式であると仮定すると、すべてのPOSIX互換ユーティリティで機能します。特に、sed
入力に現在のシステムで有効な文字を形成しないバイトまたはバイトシーケンスがある場合、通常は機能しません。locale )役割(例:printf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
UTF-8ロケール)。
答え4
テキストの最初のフィールドと最後のフィールドを|
。
あなたのログファイルに次のテキストが含まれているとします。
foo|dog|cat|mouse|lion|ox|tiger|bar
bar|dog|cat|mouse|lion|ox|tiger|foo
希望の出力は次のとおりです。
foo bar
bar foo
もしそうなら、これはあなたの命令です
GNU sedを通じて、
sed -r 's~^([^|]*).*\|(.*)$~\1 \2~' file
例:
$ echo 'foo|dog|cat|mouse|lion|ox|tiger|bar' | sed -r 's~^([^|]*).*\|(.*)$~\1 \2~'
foo bar