공통 필드가 있는 두 개의 파일이 있다고 가정해 보겠습니다. 이 파일에 있는 필드(예: 숫자 필드)를 기반으로 첫 번째 파일을 정렬하고 싶습니다. 하지만 이 재정렬이 일반 필드를 통해 다른 파일에서도 작동하도록 하고 싶습니다.
예를 들어--완전히허공에서 그것을 잡아 ;-) -- 그것을 얻자/etc/비밀번호그리고/etc/shadow:
/etc/passwd: (...) sshd:x:124:65534::/var/run/sshd:/usr/sbin/nologin sndiod:x:999:29::/var/lib/sndiod:/usr/sbin/nologin dictd:x:125:135:Dictd 서버,,,:/var/lib/dictd:/bin/false postgres:x:126:136:PostgreSQL 관리자,,,:/var/lib/postgresql:/bin/bash (...)
/etc/shadow: (...) SSHD:*:17055:0:99999:7::: sdiod:!:17055:::::: 사전:*:17055:0:99999:7::: 포스트그레스:*:17055:0:99999:7::: (...)
종류/etc/비밀번호UID의 숫자는 간단합니다.
sort -n -t: -k3 /etc/passwd > pw
위 줄의 결과는 다음과 같습니다.
/etc/passwd: (...) sshd:x:124:65534::/var/run/sshd:/usr/sbin/nologin dictd:x:125:135:Dictd 서버,,,:/var/lib/dictd:/bin/false postgres:x:126:136:PostgreSQL 관리자,,,:/var/lib/postgresql:/bin/bash sndiod:x:999:29::/var/lib/sndiod:/usr/sbin/nologin (...)
하지만,/etc/shadow하다아니요나중에 정렬할 수 있는 숫자 UID 필드가 있지만... 그렇습니다./etc/비밀번호-- 사용자 이름 필드가 있습니다...
행을 다시 정렬하는 방법이 있습니까?/etc/shadow이런 방식으로 사용자 이름 필드의 순서는 다음의 사용자 이름 필드 순서와 동일합니다.숫자순으로 정렬 /etc/비밀번호?
sort
정렬할 수 있는 명령 또는 이와 유사한 것이 있습니까 ?파일 A이 파일의 특정 키 뒤에도 정렬문서 B두 파일이 공유하는 공통 필드에 있습니까?- 또는 다음을 사용하여 정렬할 수 있는 적절한 2단계 프로세스(명령, sed/AWK/Perl 스크립트 또는 기타)가 있습니까?파일 A재 주문문서 B공통 영역을 지나면?
답변1
파일을 연결하고, 병합된 파일을 정렬하고, 원하지 않는 열을 제거합니다.
이 경우 field1 of는 field1 of 와 /etc/passwd
연결되어 필드 구분 기호 역할을 합니다./etc/shadow
:
join -t : -1 1 -2 1 /etc/passwd /etc/shadow |
sort -t : -k 3,3n |
cut -d : -f 1,8-
답변2
더 우아한 방법이 있을 수 있지만 다음은 2단계 접근 방식입니다.
for user in $(sort -n -t: -k3 /etc/passwd | cut -d: -f1)
do
grep ^${user}: /etc/shadow
done > /tmp/shadow.new
/etc/passwd의 각 항목에 대해 /etc/shadow를 한 번씩 읽습니다.
답변3
내 컴퓨터에서 /etc/shadow를 읽으려면 sudo가 필요합니다.
sudo awk -F: 'NR==FNR {uid[$1]=$3; next} {print uid[$1], $0}' /etc/passwd /etc/shadow |
sort -n |
cut -d" " -f2-
awk 스크립트는 섀도우 파일의 사용자 이름에 해당하는 passwd 파일의 uid를 공백으로 구분하여 인쇄합니다. 그런 다음 숫자별로 정렬하고 cut 명령을 통해 uid를 삭제합니다.