4つのフィールドがありますが、最後の列から始めて最初の3つの列を無視したいと思います。 awkでNFを使用してこれを行うにはどうすればよいですか?
root pts/0 192.168.108.1 Mon Mar 19 08:45 still logged in
root tty1 Mon Mar 19 08:45 still logged in
reboot system boot 3.10.0-693.el7.x Mon Mar 19 08:44 - 08:49 (00:04)
root pts/0 192.168.108.1 Sun Mar 18 13:06 - crash (19:37)
root tty1 Sun Mar 18 13:06 - crash (19:38)
reboot system boot 3.10.0-693.el7.x Sun Mar 18 13:01 - 08:49 (19:47)
root pts/2 192.168.108.1 Sat Mar 17 12:38 - 13:09 (00:31)
root pts/1 192.168.108.1 Sat Mar 17 10:49 - down (02:20)
root pts/1 192.168.108.1 Fri Mar 16 23:17 - 00:30 (01:13)
root pts/0 192.168.108.1 Fri Mar 16 21:25 - 12:56 (15:31)
root tty1 Fri Mar 16 21:25 - 13:09 (15:44)
reboot system boot 3.10.0-693.el7.x Fri Mar 16 21:04 - 13:09 (16:05)
root pts/2 192.168.108.1 Fri Mar 16 08:45 - crash (12:18)
root tty1 Fri Mar 16 08:45 - 17:25 (08:40)
syslog **Never logged in**
私はちょうど以下を表示したいと思います:
Sun Jan 19 13:52:08 -0800 2018
**Never logged in**
Fri Mar 16 08:45 - 17:25 (08:40)
Mon Mar 19 08:45 still logged in
答え1
単純なawk
コマンドを使用して、複数のスペースをフィールド区切り文字として使用して最後の列の内容を印刷できます。デフォルトの区切り文字awk
は単一のスペースであるため、最後の列に直接使用すると最後の列の内容が分割されます。このNR>
条件は、定義された実際の操作を適用するときに最初の行をスキップするのに役立ちますawk
。
awk -F '[[:space:]][[:space:]]+' 'NR>1{print $NF}' file
または、sed
列と列で区切られた単語の間に複数のスペースがあるとします。ただ最後の列に。
sed '1d;s/^.* //' file
OPは、last
最後の列出力を希望する列コマンドの出力をダンプするために質問を再構成したようです。中間列自体にスペースがある可能性があるため、日付名を含む列を一致させ、そこから行末まで印刷します。
last | awk ' {
for( i=1;i<=NF;i++ ) {
if ( $i ~ /Mon|Tue|Wed|Thu|Fri|Sat|Sun/ ) {
j = 0
str = ""
for ( j=i; j<=NF;j++ ) {
str = ( str ? (str FS $j):$j )
}
print str
break
}
}
}'
答え2
質問の元のバージョンについては、Inianの回答に「いいね」を表示して投票した後、この回答を削除しましたが、これで質問が変更されました。
awk 'NR>1{if ($2~/^\*\*/) $2=foo;if ($3!~/^[[:digit:].]+$/) $3=foo; $1=$2=$3="";print}' file
if
ステートメントは、2番目の列がIPアドレスである**Never
か、3番目の列がIPアドレスではない場合、2番目と3番目の列にダミー値を入れる必要がありますが、他の奇妙な可能性があると応答が失敗します。
ちょっと長いので、読みやすくするために1行をもう一度投稿します…
awk 'NR > 1 {
if ( $2 ~ /^\*\*/ ) $2=foo
if ( $3 !~ /^[[:digit:].]+$/ ) $3=foo
$1=$2=$3=""
print }' file