입력 파일내 .txt
파일에는 다음 내용이 포함되어 있습니다.
Tom Thatcher's Fortune, by Horatio Alger, Jr. 56896
Paradise Lost, by John Milton 20
첫 번째 문자열은 책 제목, 두 번째 문자열은 저자, 마지막 문자열은 책 번호입니다. 누군가 책 번호를 검색하면(책 번호가 일치하는 경우) 전체 줄을 인쇄하고 싶습니다. 저는 bash 스크립팅을 처음 접했습니다.
답변1
그것은 마치
grep BOOKNUMBER textfile.txt
이 문제는 해결되어야 합니다.
The Fortunes of Tom Thatcher도 나와 있는 96권을 검색하지 않으려면 다음을 사용하세요.
grep '[[:space:]]BOOKNUMBER[[:space:]]*$' textfile.txt
대신에.
스크립트로(다른 이름으로 저장 searchbook
)
#!/bin/bash
BOOKFILE=/path/to/bookfile.txt
BOOK=$1
if [[ -z "$BOOK" ]]; then
echo -n "Booknumber? "
read BOOK
fi
grep '[[:space:]]'$BOOK'[[:space:]]*$' $BOOKFILE
그럼 당신은 실행할 수 있습니다
searchbook BOOKNUMBER
또는
searchbook
두 번째 경우에는 숫자를 입력하라는 메시지가 표시됩니다.
답변2
다음을 위해 사용할 수 있습니다 grep
:
grep 56896 file.txt
스크립트를 작성하려면 다음과 같을 수 있습니다.
#!/bin/bash
inputfile='/path/to/file.txt'
grep "$1" "$inputfile"
그런 다음 다음과 같이 실행합니다.
$ ./script.sh 56896
답변3
196
book# 으로 book# 캡처를 방지하려면 96
유사하지만 더 간결한 사용법을 권장합니다 grep
.
grep ' 96$' file.txt
정규식의 기호는 $
"텍스트 예의 끝"을 나타내므로 올바른 줄에서만 일치합니다.
이는 스크립트에 넣을 수도 있습니다.
#!/bin/bash
grep " ${1}\$" /path/to/file.txt
이 작업은 다음을 통해 더욱 안전하게 수행할 수도 있습니다 awk
.
awk -v book=96 '$NF == book {print}' file.txt
답변4
마지막 단어가 무엇인지 줄을 인쇄하기 위해 다음 awk
과 같이 생각했습니다.
awk '$NF == "123"' # string comparison
awk '$NF == 123' # number comparison, would also match on 0123, 123.0, 1.23e2
awk '$NF == ENVIRON["ENVVAR"]' # number comparison if both $NF and $ENVVAR
# look like numbers, string otherwise
awk
그 사람들을 위해성격기본적으로 공백으로 구분됩니다. 구현에 따라 다름공백단지 공백이나 탭일 수 있으며, 일부는 로케일에서 분류된 경우 다른 유니코드 공백 문자를 포함할 수도 있습니다. 구현 busybox
awk
에는 캐리지 리턴 문자를 포함한 수직 공백 문자도 포함됩니다.
파일이 LF 대신 CR LF 문자 시퀀스인 MS-DOS 줄 구분 기호를 사용하여 형식화되면 busybox awk를 제외하고는 위 방법이 작동하지 않습니다. busybox awk를 사용하더라도 출력 줄에는 Unix에 표시되어서는 안 되는 문제가 있는 제어 문자가 여전히 포함되어 있습니다.
dos2unix
d2u
따라서 줄 끝을 Unix 형식으로 변환하려면 입력을 사용하거나 전처리해야 합니다 .
< file.dos dos2unix | awk '$NF == 123'
입력 파일은 빈 줄로 구분된 레코드로 구성된 것처럼 보입니다. ISBN의 전체 기록을 인쇄하려면 다음을 수행하세요.
export BOOKNUMBER=123
< file.dos dos2unix | awk -v RS= -F '\n' '
field[split($1, field, " ")] == ENVIRON["BOOKNUMBER"]'
거기에 우리가 설정기록 구분 기호 빈 문자열을 입력하세요.단락 모드(빈 줄로 구분된 레코드) 및필드 구분 기호개행 문자(LF라고도 함)이므로 각 레코드의 첫 번째 줄은 $1
(첫 번째 필드)에 있습니다. 첫 번째 줄을 특수 줄과 분리하고 " "
기본값을 사용하겠습니다.단어field
배열 로 분할합니다 . 해당 배열의 마지막 요소( split()
요소 수를 반환하므로 field[split()]
마지막 요소도 마찬가지임)는 환경 변수의 내용과 비교됩니다 $BOOKNUMBER
.