awk를 사용하여 특정 열의 내용 추출

awk를 사용하여 특정 열의 내용 추출

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명령문은 두 번째 열이 IP 주소이거나 **Never세 번째 열이 IP 주소가 아닌 경우 두 번째 및 세 번째 열에 더미 값을 넣어야 하지만, 다른 이상한 가능성이 있으면 응답이 실패하게 됩니다...

좀 길기 때문에 가독성을 위해 한 줄을 다시 게시하겠습니다…

awk 'NR > 1 {
  if ( $2 ~ /^\*\*/ ) $2=foo
  if ( $3 !~ /^[[:digit:].]+$/ ) $3=foo
  $1=$2=$3=""
  print }' file

관련 정보