이라는 파일과 관련된 다양한 정보를 제공하는 기능이 있습니다 CODESFILE-00001.DAT
.
함수 내에서 다음 명령은 제대로 작동하며 다음을 포함하는 행을 반환합니다 00202200USER
.
strings CODESFILE-00001.DAT | grep 00202200USER
CODESFILE-00001.DAT
그러나 스크립트 전체에 변수를 삽입하는 대신 하나의 변수를 사용하여 매주 버전이 .DAT
변경될 때 스크립트의 7개 항목 모두 대신 변수만 변경하면 됩니다(찾기 및 바꾸기가 훌륭하다는 것을 알고 있지만 궁금합니다). 변수에서 파일 이름을 설정하는 것이 가능한 경우)
변수를 다음으로 설정한 filename=CODESFILE-00001.DAT
후 다음을 시도했지만 성공하지 못했습니다.
strings $filename | grep 00202200USER
strings “$filename” | grep 00202200USER
답변1
PATH
디렉토리와 chmod +x
파일에 저장하십시오.
#! /bin/sh -
: "${1?Syntax: $0 <file>}"
strings -- "$1" | grep '00202200USER'
더 복잡한 오류 검사를 생성하거나 다양한 모드에 대한 옵션을 지정할 수도 있지만 grep
본질적으로 그게 전부입니다.
$1
(및 $0
및 옵션 구분 기호)은 --
견고성을 위해 중요하지만 곱슬 "타이피스트" 따옴표(질문 201D의 U+201C, U+)가 아닌 직선 ASCII 따옴표(U+0022)여야 합니다.
마찬가지로, 더 긴 스크립트에서는 다음을 설정할 수 있습니다.
filename=${1-CODESFILE-00001.DAT}
CODESFILE-00001.DAT
스캔할 파일의 기본 이름을 지정 하지만 사용자가 명령줄에 인수를 추가하여 파일 이름을 재정의할 수 있습니다.
grep
출력에서 여러 모드를 사용 하려면 strings
다음과 같이 말할 수 있습니다.
strings -- "$filename" |
grep -e '00202200USER' \
-e '1234SYSTEM' \
-e '7890REAL'
이 세 문자열을 동시에 검색하거나(찾은 순서대로 출력됨), 검색 문자열을 기준으로 정렬하거나 결과를 후처리하려는 경우 간단한 Awk 스크립트로 리팩터링할 수 있습니다. 대략적인 스케치입니다.
strings -- "$filename" |
awk -v patterns='00202200USER;1234SYSTEM;7890REAL' '
BEGIN { n=split(patterns, pat, ";") }
{ for(i=1; i<=n; ++i) if ($0 ~ pat[i]) hits[i] = hits[i] "\n\t" $0 }
END { for(i=1; i<=n; ++i) print pat[i] hits[i] }'
예제 출력:
00202200USER
ick 00202200USER;1234SYSTEM;7890RE
1234SYSTEM
ick 00202200USER;1234SYSTEM;7890RE
foo 1234SYSTEM
7890REAL
poo 7890REAL
bah 7890REAL
(패턴이 맞지 않으면 어쨌든 인쇄됩니다. 이를 원하지 않으면 수정 사항이 상당히 명확해야 합니다.)
답변2
더 간단합니다.
#!/bin/sh
filename=CODESFILE-00001.DAT
pattern=00202200USER
grep $pattern $filename
파일 이름을 마지막 인수로 사용할 수 있으므로 그럴 필요가 없습니다(사용하는 것을 두려워하지 strings
마십시오 ) .grep
man grep
변수에 공백이 없으므로 여기에는 따옴표가 필요하지 않습니다. 하지만 그렇습니다. 다음을 인용할 수도 있습니다.
grep "$pattern" "$filename"