저는 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
대안으로 이 간단한 ++를 사용할 수 있음을 의미합니다 .cut
tr
grep -F 'student' /etc/passwd | cut -d':' -f1,7 | tr ':' ' ' | LC_ALL=C sort -o "$outfile"
grep
파일에서 관심 있는 모든 줄을 찾으세요 . cut
첫 번째 필드와 마지막 필드를 알려주세요. 두 필드 사이의 공백 문자가 tr
대체됩니다.: