주어진 입력에 대해 .txt 파일을 검색하고 발견되면 전체 줄을 인쇄합니다.

주어진 입력에 대해 .txt 파일을 검색하고 발견되면 전체 줄을 인쇄합니다.

입력 파일.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

196book# 으로 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에 표시되어서는 안 되는 문제가 있는 제어 문자가 여전히 포함되어 있습니다.

dos2unixd2u따라서 줄 끝을 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.

관련 정보