AWK - 마지막 열과 null 값을 인쇄합니다.

AWK - 마지막 열과 null 값을 인쇄합니다.

$NF마지막 열 번호를 모르는 경우 파일의 각 줄의 마지막 열을 인쇄할 수 있습니다.

하지만 제가 직면한 어려움은 마지막 열에 null 값이 있다는 것입니다.

예를 들어,구문 분석 who명령

$ who
root     tty1         2018-01-25 09:36
root     pts/0        2018-05-30 07:39 (192.168.1.134)
root     pts/1        2018-05-28 23:12 (192.168.1.134)
root     pts/2        2018-06-01 10:01 (192.168.1.188)

답변을 얻었습니다 :

$ who | awk '{print $NF}'
09:36
(192.168.1.134)
(192.168.1.134)
(192.168.1.188)

예상되는 결과

(192.168.1.134)
(192.168.1.134)
(192.168.1.188)

한 줄로 원하는 결과를 얻을 가능성을 알려주세요.

편집 1:위의 시나리오는 단지 예시일 뿐입니다. 결과를 얻기 위해 구분 기호를 변경하는 것을 좋아하지 않습니다.

편집 2:최대값보다 적은 수의 필드가 있는 줄에는 아무것도 포함되지 않습니다(빈 출력 줄).

답변1

최대 열 수가 있는 행의 마지막 열만 출력하려면 다음을 수행하면 됩니다.

who | awk '
  NF > max  {max = NF; output = ""}
  NF == max {output = output $NF ORS}
  END       {printf "%s", output}'

입력의 각 행에 대해 하나의 행을 출력하지만 최대 열 수가 없는 행의 경우 비어 있습니다.

who | awk '
  NF > max {max = NF}
  {n[NR] = NF}
  NF == max {last[NR] = $NF}
  END {for (i = 1; i <= NR; i++) print n[i] == max ? last[i] : ""}'

답변2

필드가 가장 많은 행에서 마지막 필드만 가져오려면 데이터를 두 번 읽어야 합니다. 한 번은 최대 필드 수를 알아내고 다시 한 번 필드를 인쇄해야 합니다. 한 번만 읽어도 문제가 해결되지 않습니다. 모든 행에 이전보다 더 많은 필드가 있을 수 있으며 알 방법이 없습니다.

사용 awk(파일 이름이 두 번 제공됨):

awk -vfields=0 'FNR==NR {if (NF > fields) fields=NF; next} 
     NF >= fields { print $NF } NF < fields {print ""}' file file

file다음을 포함하는 경우

foo bar
one two three four
1 2 3
a b c d

그러면 네 번째 필드가 인쇄되거나 해당 필드가 없는 행은 비어 있습니다.

4개

물론 이것은 파이프에서는 작동하지 않습니다. 임시 파일을 사용해야 합니다.

또 다른 해결책은 아래와 같이 더 많은 필드가 포함된 줄이 나타날 때까지 인쇄할 필드를 캐시하는 것입니다.스티븐의 대답.

답변3

5번째 필드가 일치하는지 확인 \(.*\)하고 그렇다면 인쇄하세요.

who | awk '$5 ~ /\(.*\)/{print $5}'

주소에만 관심이 있는 경우 ip정규식을 변경하세요.

who |  awk '$5 ~ /\((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\)/{print $5}'

답변4

해당 열을 사용할 수 있는 경우 마지막 열만 가져오려면 행을 선택했다는 사실을 이용하세요.아니요4개의 열만 원합니다.

who | awk 'NF > 4 { print $NF }'

또는 유사한 데이터를 얻으려면

w -hi | awk '{ print $3 }'

관련 정보