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