使用awk从文件的第一行打印特定字段

时间:2013-02-20 02:02:51

标签: awk line field

我有一个文件(logins.txt),我需要将其生成一个文件,该文件仅显示第一个和最后一个登录日期/时间以及上次登录日期/时间。 logins.txt看起来像这样:

Feb 13 2:43 (login IP)
Feb 13 2:48 (login IP)
Feb 13 5:23 (login IP)
Feb 13 9:43 (login IP)
Feb 14 1:34 (login IP)
Feb 14 8:42 (login IP)
Feb 14 8:47 (login IP)

我想打印:

First Login: Feb 13 2:43
Last Login: Feb 14 8:47

现在请记住我正在使用一个.awk文件,其中我有所有的awk语句,执行logins.txt并使用我想要打印的文件生成不同的文件。

最后一次登录很简单。我只是简单地说:

END{
print "$1, $2, $3";
}

打印出最后一次出现的那些字段。 但是如何在第一次出现时这样做呢?

编辑: 太棒了,把NR == 1起作用,但我在END领域需要这个,因为我需要它以下我要打印的其他东西。我怎么把它放在一切之下? 我也希望它像这样打印:

Blah blah blah blah blah blah blah blah
Blah blah blah blah blah blah blah blah
Blah blah blah blah blah blah blah blah
First Login: Feb 13 2:43      Last Login: Feb 14 8:47

这是我的END with print statements

NF==1 {a=$1; b=$2; c=$3;}

END{
   print "Feed\t\t\tAccepted\tRejected\tCanceled";
   print "-----------------------------------------------------------------";
   print "swrinde:\t\t", accepted_sw"\t\t", rejected_sw"\t\t", canceled_sw"\t\t";
   print "news.cais.net:\t\t", accepted_ne"\t\t", rejected_ne"\t\t", canceled_ne"\t\t";
   print "\?:\t\t\t", accepted_un"\t\t", rejected_un"\t\t", canceled_un"\t\t";
   print "\nStart Time = ", a, b, c RS "\tEnd Time =", $1, $2, $3;
}

3 个答案:

答案 0 :(得分:12)

使用NR==1限定另一个区块:

awk 'NR==1 { print "First Login:", $1, $2, $3 } END { print "Last Login:", $1, $2, $3 }' logins.txt

结果:

First Login: Feb 13 2:43
Last Login: Feb 14 8:47

NR是行数的缩写。见here。 HTH。


EDIT1:

根据您的风格,这有两种方式。第一个被认为更正确:

awk 'NR==1 { a=$1; b=$2; c=$3 } { print "Blah" } END { print "First Login:", a, b, c  RS "Last Login:", $1, $2, $3 }' logins.txt

awk 'NR==1 { x=("First Login:" FS $1 FS $2 FS $3) } { print "Blah" } END { print x RS "Last Login:", $1, $2, $3 }' logins.txt

结果:

Blah
Blah
Blah
Blah
Blah
Blah
Blah
First Login: Feb 13 2:43
Last Login: Feb 14 8:47

EDIT2:

运行您的脚本,如:

awk -f script.awk logins.txt

script.awk的内容:

NR==1 {
    a=$1
    b=$2
    c=$3
}

{
    print "Blah"
}

END {
    print "First Login:", a, b, c  RS "Last Login:", $1, $2, $3
}

<强> EDIT3:

BEGIN { OFS="\t\t" }

NR==1 { a=$1; b=$2; c=$3 }

END{
   print "Feed\t\t\tAccepted\tRejected\tCanceled"
   print "-----------------------------------------------------------------"
   print "swrinde:", accepted_sw, rejected_sw, canceled_sw
   print "news.cais.net:", accepted_ne, rejected_ne, canceled_ne
   print "?:\t", accepted_un, rejected_un, canceled_un

   print "Start Time = " a FS b FS c
   print "End Time = " $1 FS $2 FS $3
}

结果:

Feed            Accepted    Rejected    Canceled
-----------------------------------------------------------------
swrinde:                        
news.cais.net:                      
?:                          
Start Time = Feb 13 2:43
End Time = Feb 14 8:47

答案 1 :(得分:0)

awk 'NR==1{x="First Login "$1FS$2FS$3;}END{x=x" last Login "$1FS$2FS$3;print x}' your_file

测试here

答案 2 :(得分:0)

还尝试使用变量进行上次登录,因为并非每个awk都保留END部分中的字段值。例如:

awk '{l=$1 FS $2 FS $3} NR==1{f=l} END{ print "First login: " f; print "Last login: " l}' infile