각 열/필드를 출력하고 싶지만 변수를 사용하여 이 작업을 수행하면 $0
기본 변수가 단일 변수로 무시되므로 계속 인쇄됩니다.OFS
space
:
내가 시도한 명령은 다음과 같습니다.
cat /etc/passwd | awk -F':' '{print $0}'
다음 예제 입력을 고려하면 다음과 같습니다.
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
명령에서 다음 출력을 얻습니다.
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
그러나 나는 내 출력이 다음과 같기를 원합니다.
root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /usr/sbin/nologin
당신의 도움을 주셔서 감사합니다:)
답변1
$0
입력 필드 구분 기호를 포함하여 전체 줄을 나타냅니다.
필드를 설정하고 출력 필드 구분자를 사용하여 분할하고 다시 결합할 수 있습니다.
</etc/passwd awk -F: '{$1=$1;print}'
(고문 대신 파일에서 직접 읽었습니다 cat
;-)
이 내용은 다음과 같이 기록됩니다.필드 내용 변경GNU 구현 매뉴얼 섹션 awk
(일명 gawk
):
마지막으로
awk
sum 필드의 현재 값을 사용하여 전체 레코드를 강제로 다시 작성하는 것이 편리한 경우가 있습니다OFS
. 이렇게 하려면 겉으로는 무해해 보이는 할당을 사용합니다.$1 = $1 # force record to be reconstituted print $0 # or whatever else with $0
이로 인해
awk
기록이 재구성되었습니다. 여기에 표시된 것처럼 주석을 추가하면 정말 도움이 될 수 있습니다.
답변2
$0 필드는 행일 뿐이며 구문 분석되지 않습니다. NF 변수(FS에 의해 결정된 필드 수)를 사용하여 각 필드를 반복해야 합니다.
cat /etc/passwd | awk -F':' '{for (i=1;i<=NF;i++) {printf "%s ",$i}; printf "\n"};'