프로그램 작성

프로그램 작성

저는 Linux에서 스크립트를 작성하고 있는데 스크립트 파일에서 사용 중인 명령에 몇 가지 문제가 있습니다. 이것이 내가 달성하고 싶은 것입니다:

/etc/passwd 파일에서 "student"라는 문구가 포함된 모든 행을 찾습니다.

이 결과의 첫 번째 필드와 마지막 필드를 가져옵니다.

행을 알파벳순으로 정렬

정렬된 행을 사용자가 지정한 파일에 넣습니다.

답변1

#!/bin/sh

outfile="${1:-out}"

if [ -e "$outfile" ]; then
    printf 'The filename "%s" already exists, refusing to overwrite\n' "$outfile" >&2
    exit 1
fi

awk -F':' '/student/ { print $1, $NF }' /etc/passwd | LC_ALL=C sort -o "$outfile"

awk이 스크립트는 파일을 구문 분석 하는 데 사용됩니다 passwd. 문자열을 포함하는 줄을 제외한 모든 줄을 건너뜁니다 student. 이러한 줄의 경우 첫 번째와 마지막 :으로 구분된 필드가 출력됩니다.

의 출력은 표준 POSIX 로케일의 사전순으로 줄을 정렬하고 결과를 명령줄에 지정된 이름의 파일에 저장하는 로 awk전달됩니다 .sort

명령줄에 파일 이름이 지정되지 않으면 out이름이 지정된 파일이 생성됩니다. 이름별 출력 파일이 이미 존재하는 경우 스크립트는 오류와 함께 종료됩니다.

$ chmod +x script
$ ./script output

출력은 output이 예에 지정된 파일에서 찾을 수 있습니다.

다음 명령의 대안으로 awk:

sed '/student/s/\([^:]*\):.*:\(.*\)$/\1 \2/' /etc/passwd | LC_ALL=C sort -o "$outfile"

이는 동일한 작업을 수행하지만 문자열을 포함하는 각 줄에 대체를 적용합니다 student. 교체는 전체 줄을 첫 번째 줄 앞의 내용 :, 그 뒤에 공백, 마지막 줄 뒤의 내용 으로 바꿉니다 :.

형식은 잘 알려져 있으므로 passwd마지막 열이 7열이라는 것을 알 수 있습니다. 이는 grep대안으로 이 간단한 ++를 사용할 수 있음을 의미합니다 .cuttr

grep -F 'student' /etc/passwd | cut -d':' -f1,7 | tr ':' ' ' | LC_ALL=C sort -o "$outfile"

grep파일에서 관심 있는 모든 줄을 찾으세요 . cut첫 번째 필드와 마지막 필드를 알려주세요. 두 필드 사이의 공백 문자가 tr대체됩니다.:

관련 정보