AWK - 빈 값과 함께 마지막 열을 인쇄합니다.

AWK - 빈 값과 함께 마지막 열을 인쇄합니다.

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

하지만 마지막 열에 빈 값이 있다는 것이 어려움에 직면했습니다.

예를 들어,구문 분석 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

이는 네 번째 필드를 인쇄하거나 해당 필드가 없는 줄의 경우 비어 있습니다.



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

대체 솔루션은 다음과 같이 더 많은 필드가 있는 줄이 나타날 때까지 인쇄할 필드를 캐시할 수 있습니다.스테판의 대답.

답변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 }'

관련 정보