$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 }'