/etc/passwd의 일부 필드를 인쇄합니다.

/etc/passwd의 일부 필드를 인쇄합니다.

Linux에서 와일드카드 사용에 관해 질문이 있습니다. 여기에는 /etc/passwd 파일의 긴 시퀀스에서 일부 라인이 있습니다.

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
...

이 줄에서 사용자 이름, UID 번호 및 GID 번호만 인쇄하는 데 적합한 명령은 무엇입니까? (가능한 경우 더 자세히 알아볼 수 있도록 여러 가지 방법을 보여주세요.)

답변1

"와일드카드"나 정규 표현식이 필요하지 않은 한 가지 방법은 텍스트 파일에서 문자로 구분된 줄을 지정하는 작업을 처리할 수 있는 cut.cut/etc/passwd

cut -d: -f1,3,4 /etc/passwd

출력에는 콜론으로 구분된 필드가 포함됩니다. GNU에는 "--output-delimiter"라는 추가 옵션이 있는 것처럼 보이지만 cut다음을 사용할 수도 있습니다 tr.

cut -d: -f1,3,4 /etc/passwd | tr ':' '\t'

cut다음과 같이 작동하는 옵션:

  • -d:- 필드 구분자로 콜론 문자를 사용합니다. 기본값은 탭입니다.
  • -f1,3,4- 필드 번호 1, 3, 4를 출력합니다. cut행 왼쪽부터 1개의 인덱스 필드를 사용합니다. 필드 2는 암호화된 비밀번호가 나타나는 "x"입니다.

awk명령은 다음과 같은 경우에도 작동합니다.

awk -F : '{print $1, $3, $3}' /etc/passwd

-F :옵션은 awk필드를 구분하기 위해 콜론을 사용함을 나타냅니다. awk이는 행의 필드가 왼쪽에서 오른쪽으로 $1, $2, $3...임을 의미합니다. $0은 일반적으로 인쇄하려는 전체 줄을 저장하지만 이번에는 그렇지 않습니다.

sed다음을 수행할 수 있습니다.

sed 's/^\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):..*/\1 \3 \4/' /etc/passwd 

명령 에서 sed마침내 "와일드카드"를 만나게 되지만 이 경우에는 보기 흉해 보입니다.

내 조언은 명령을 선호하는 것입니다 cut. 이 sed예에서는 원하는 것을 얻기 위한 정규 표현식이 보기 흉할 수 있어 올바른 결과를 얻기 어려울 수 있음을 보여줍니다. 기본적으로 토큰을 구분하는 데 공백이 사용되므로 awk이상의 작업을 수행할 수 있습니다 cut. awk이렇게 하면 필드 구분 기호 사양을 조작하는 것보다 시간이 절약됩니다 cut.

답변2

read내장된 기능을 사용하세요 :

while IFS=: read -r user _ uid gid _; do printf "%s\t%s\t%s\n" "$user" "$uid" "$gid"; done </etc/passwd

이렇게 하면 실제로 필요한 필드를 인쇄하기 전에 필드 구분 기호를 설정하고 :사용하며 필요하지 않은 변수는 삭제됩니다._

관련 정보