Bash를 사용하여 파일에 문자열이 있는지 테스트하려면 어떻게 해야 합니다.
디렉토리 이름이 포함된 파일이 있습니다.
my_list.txt
:
/tmp
/var/tmp
디렉토리명이 파일에 이미 존재하는 경우 추가하기 전에 Bash 체크인을 하고 싶습니다.
grep -Fxq "$FILENAME" my_list.txt
이름이 발견되면 종료 상태는 0(true), 발견되지 않으면 1(false)입니다.따라서 다음과 같습니다.
if grep -Fxq "$FILENAME" my_list.txt
then
# code if found
else
# code if not found
fi
설명.
의 man 페이지의 관련 섹션을 다음에 나타냅니다.
grep [options] PATTERN [FILE...]
-F
,--fixed-strings
PATTANGE은 일치하는 고정 문자열 목록으로 해석하고 줄 바꿈으로 구분합니다.
-x
,--line-regexp
행 전체와 정확히 일치하는 항목만 선택하십시오.
-q
,--quiet
,--silent
Quiet; 표준 출력에 아무것도 쓰지 마십시오.에러가 검출되었을 경우라도, 일치하는 것이 발견되었을 경우는, 즉시 제로 상태로 종료합니다.「」도 참조해 주세요.
-s
또는--no-messages
선택.
에러 처리
코멘트에서 올바르게 지적된 바와 같이 위의 접근방식은 에러 케이스를 스트링이 검출된 것처럼 사일런트하게 처리합니다.에러를 다른 방법으로 처리하려면 , 다음의 순서를 생략할 필요가 있습니다.-q
옵션을 지정하고 종료 상태를 기준으로 오류를 검출합니다.
통상, 선택한 회선이 발견되면 종료 상태는 0, 그 이외의 경우는 1 입니다.단, 에러가 발생했을 경우 종료 상태는 2 입니다.단, 에러가 발생했을 경우는
-q
또는--quiet
또는--silent
옵션이 사용되며 선택한 행이 검색됩니다.단, POSIX는 다음과 같은 프로그램에 대해서만 명령합니다.grep
,cmp
,그리고.diff
에러시의 종료 상태가 1보다 큰 것을 나타냅니다.따라서 휴대성을 위해 2와 완전히 동일한 것이 아니라 이 일반적인 조건을 테스트하는 논리를 사용하는 것이 좋습니다.
로부터의 통상의 출력을 억제하려면grep
, 로 리다이렉트 할 수 있습니다./dev/null
. 표준 오류는 방향성이 없는 상태로 유지되므로 오류 메시지가 표시될 경우grep
인쇄가 콘솔에 표시될 수 있습니다.
이 세 가지 사건을 처리하려면case
스테이트먼트:
case `grep -Fx "$FILENAME" "$LIST" >/dev/null; echo $?` in
0)
# code if found
;;
1)
# code if not found
;;
*)
# code if an error occurred
;;
esac
다음 솔루션에 대해서:
grep -Fxq "$FILENAME" my_list.txt
(나처럼) 궁금할 것 같아서-Fxq
쉬운 영어로 다음을 의미합니다.
F
: PATTANGE의 해석 방법에 영향을 줍니다(regex 대신 고정 문자열).x
: 전행 매칭q
: 쉿... 최소 인쇄
man 파일에서:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.
(-F is specified by POSIX.)
-x, --line-regexp
Select only those matches that exactly match the whole line. (-x is specified by POSIX.)
-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit immediately with zero status if any match is
found, even if an error was detected. Also see the -s or --no-messages option. (-q is specified by
POSIX.)
제 머릿속에는 세 가지 방법이 있습니다.
1) 경로 내 이름의 간단한 테스트(이것이 당신의 경우인지 확실하지 않습니다.
ls -a "path" | grep "name"
2) 파일 내의 문자열에 대한 짧은 테스트
grep -R "string" "filepath"
3) regex를 사용한 bash :
#!/bin/bash
declare file="content.txt"
declare regex="\s+string\s+"
declare file_content=$( cat "${file}" )
if [[ " $file_content " =~ $regex ]] # please note the space before and after the file content
then
echo "found"
else
echo "not found"
fi
exit
예를 들어 임의의 cicle에서 regex를 변경하는 등 루프를 사용하여 파일 내용에서 여러 문자열을 테스트해야 하는 경우에는 이 작업이 더 빠를 것입니다.
가장 쉽고 간단한 방법은 다음과 같습니다.
isInFile=$(cat file.txt | grep -c "string")
if [ $isInFile -eq 0 ]; then
#string not contained in file
else
#string is in file at least once
fi
grep - c는 파일에서 문자열이 발생한 횟수를 반환합니다.
간단한 방법:
if grep "$filename" my_list.txt > /dev/null
then
... found
else
... not found
fi
: ★★★★★★★★★★★★★★★★★★★★★★./dev/null
명령어 종료 상태를 원하지만 출력은 원하지 않는 경우.
다음은 문자열 또는 부분 문자열을 검색 및 평가하는 빠른 방법입니다.
if grep -R "my-search-string" /my/file.ext
then
# string exists
else
# string not found
fi
명령어가 다음 명령어만 실행하여 결과를 반환하는 경우에도 먼저 테스트할 수 있습니다.
grep -R "my-search-string" /my/file.ext
grep -E "(string)" /path/to/file || echo "no match found"
-E 옵션을 사용하면 GREP가 정규 표현을 사용할 수 있습니다.
제가 당신의 질문을 제대로 이해했다면, 이것은 당신이 필요로 하는 것을 할 것입니다.
- $check 변수를 통해 추가할 디렉토리를 지정할 수 있습니다.
- 디렉토리가 이미 리스트에 있는 경우는, 출력은 「이미 리스트 되어 있는 디렉토리」가 됩니다.
- 디렉토리가 아직 목록에 없으면 my_list에 추가됩니다.txt
한 줄:check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt
@Thomas의 솔루션은 어떤 이유에서인지 작동하지 않았지만 특수 문자와 공백 문자열이 길었기 때문에 다음과 같이 파라미터를 변경했습니다.
if grep -Fxq 'string you want to find' "/path/to/file"; then
echo "Found"
else
echo "Not found"
fi
도움이 되었으면 좋겠다
한 줄의 존재 여부만 확인하는 경우 파일을 작성할 필요가 없습니다.예.,
if grep -xq "LINE_TO_BE_MATCHED" FILE_TO_LOOK_IN ; then
# code for if it exists
else
# code for if it does not exist
fi
fgrep을 사용한 내 버전
FOUND=`fgrep -c "FOUND" $VALIDATION_FILE`
if [ $FOUND -eq 0 ]; then
echo "Not able to find"
else
echo "able to find"
fi
터미널과 필터 라인에서 일반적인 "grep 동작"으로 이 작업을 수행할 방법을 찾고 있었습니다.을 에 저장하다strings.txt
:
string1
string2
...
'와 같은 정규 표현을 만들 수 요.(string1|string2|...)
필터링에 사용합니다.
cmd1 | grep -P "($(cat strings.txt | tr '\n' '|' | head -c -1))" | cmd2
편집: 위는 정규식 문자를 사용하지 않는 경우에만 작동합니다. 이스케이프가 필요한 경우 다음과 같이 수행할 수 있습니다.
cat strings.txt | python3 -c "import re, sys; [sys.stdout.write(re.escape(line[:-1]) + '\n') for line in sys.stdin]" | ...
GREP가 필요 없는 솔루션이라면 다음과 같은 이점이 있습니다.
MY_LIST=$( cat /path/to/my_list.txt )
if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
echo "It's there!"
else
echo "its not there"
fi
기준: https://stackoverflow.com/a/229606/3306354
grep -Fxq "String to be found" | ls -a
- grep은 콘텐츠를 확인하는 데 도움이 됩니다.
- ls는 모든 파일을 나열합니다.
갈림길이 cat
이 포함될 수 .
contains() {
[[ " ${list[@]} " =~ " ${1} " ]] && echo 'contains' || echo 'does not contain'
}
IFS=$'\r\n' list=($(<my_list.txt))
그러니까 일단은my_list.txt
/tmp
/var/tmp
/Users/usr/dir with spaces
이 테스트들
contains '/tmp'
contains '/bin'
contains '/var/tmp'
contains '/Users/usr/dir with spaces'
contains 'dir with spaces'
돌아가다
exists
does not exist
exists
exists
does not exist
if grep -q "$Filename$" my_list.txt
then
echo "exist"
else
echo "not exist"
fi
언급URL : https://stackoverflow.com/questions/4749330/how-to-test-if-string-exists-in-file-with-bash
'sourcecode' 카테고리의 다른 글
리스트 이해 python의 루프를 위해 2를 프레임하는 방법 (0) | 2023.04.09 |
---|---|
Windows PowerShell에서 표준 입력/출력 리다이렉트 (0) | 2023.04.09 |
목록을 피클 파일에 덤프하고 나중에 다시 검색 (0) | 2023.04.09 |
첫 페이지에서만 iPhone 탐색 모음 숨기기 (0) | 2023.04.09 |
VBA는 OOP 언어이며 다형성을 지원합니까? (0) | 2023.04.09 |