파일 목록에서 단어 목록을 찾아야 합니다. 그래서 단어 목록을 파일에 넣고 for
루프를 사용하여 파일의 각 단어를 읽고 find 명령을 사용하여 grep
찾은 파일 목록에서 해당 단어를 찾았습니다.
언급된 Linux 버전을 사용하고 있습니다.
bash-3.1$ uname
HP-UX
아래에 언급된 내용은 내 쉘 스크립트입니다.
#!/bin/sh
PATH="/NO/20171013"
STRING=`/usr/bin/cat /home/test/STAT44_test.txt`
for LINE in ${STRING}
do
echo "find ${PATH} -type f -name \"*.txt\" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l"
LINES=`find ${PATH} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l`
echo "LINES count is ${LINES}"
if [ ${LINES} -eq 0 ]
then
echo "In not found"
# echo "${LINE} is not found in ${PATH}" >> /home/test/STAT44_not_found.out
else
echo "In Found"
# echo "${LINE} is found in ${PATH}" >> /home/test/STAT44_found.out
fi
done
find 명령은 find ${PATH} -type f -name "*.txt" -exec grep -w '${LINE}' {} \; 2>/dev/null
명령 프롬프트에서 완벽하게 작동하지만 위에서 언급한 것처럼 쉘 스크립트에서 사용하면 출력이 제공되지 않습니다.
출력 echo $?
은 0이지만 find 명령은 출력을 생성하지 않습니다.
스크립트의 출력은 다음과 같습니다
find /NO/20171013 -type f -name "*.txt" -exec grep -w 655044810645 {} \; 2>/dev/null | /usr/bin/wc -l
LINES count is 0
In not found
find /NO/20171013 -type f -name "*.txt" -exec grep -w 734729751028 {} \; 2>/dev/null | /usr/bin/wc -l
LINES count is 0
In not found
실제로 *.txt
아래 파일에는 /NO/20171013
패턴 655044810645
과 가 734729751028
있으므로 Word count
0이 아니어야 하고 else
해당 섹션으로 들어가야 합니다.
무엇이 누락되었을 수 있나요?
답변1
$PATH
예의미있는 중요한 변수. 다른 이름을 선택해야 합니다.
이 경우에는 원인이 없기 find
때문에 실행 파일을 찾을 수 없습니다 . $PATH
때문에 알림을 받지 못했습니다 2>/dev/null
.
echo
$PATH
아마도 쉘이 내장되어 있으므로 작동할 필요가 없습니다 . for
기다리는 것도 마찬가지다.
답변2
첫 번째, 적절한 것을 설정하고 $PATH
(답변을 확인하세요)카밀 마코로프스키):
적절한 사용자(루트?)로 로그인하고 다음을 실행합니다.
echo PATH=$PATH
스크립트 시작 부분에 출력 추가
또는명령의 전체 경로를 추가할 수 있습니다 find
. find
어디에 배치해야 할지 모르겠다면 다음을 수행하세요.
which find
출력은 다음과 같습니다:/usr/bin/find
루프 내부에 오류가 있습니다:
작은따옴표를 큰따옴표(둘러싸기)로 바꿔야 합니다 ${LINE}
. 그렇지 않으면 변수가 해석되지 않습니다.
echo "find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l"
LINES=`find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l`
몇 가지 참고사항:
- 그럴 필요는 없습니다
cat file
. 대신 루프를 사용해 보세요. 하지만 사용할while
수 없습니다for
!"for"가 있는 줄을 읽지 않는 이유를 읽어보세요.그리고파일(데이터 스트림, 변수)을 한 줄씩(및/또는 필드별로) 읽는 방법은 무엇입니까?