Bash 스크립트는 파일에서 단어를 검색하고 보고서를 생성합니다.

Bash 스크립트는 파일에서 단어를 검색하고 보고서를 생성합니다.

네, 숙제이긴 한데 대답을 기대하진 않아요.

시나리오에서는 모든 사용자 홈 디렉터리에서 나쁜 단어를 검색하는 스크립트가 필요합니다. 사용자 이름, 찾은 단어, 경로 등 특정 정보를 화면에 보고하려면 스크립트가 필요합니다. 사용자에게 좋은지 나쁜지 물어보고, 나쁜 경우 잘못된 파일 이름 목록에 있는 파일에 넣고, 좋은 경우 목록에서 제거하면 더 이상 스크립트에서 표시되지 않습니다.

지금까지는 어떻게든 루프를 만들고 싶습니다. 나는 이렇게 하면 grep -r -e kill -e steal /home/*나에게 필요한 것의 목록을 갖게 될 것이라는 것을 알고 있습니다. 또한 목록이 구분 기호로 구분되어 있으며 이를 파이프하여 필요한 변수를 얻을 수 있다는 것도 알고 있습니다. 또한 이것을 파일에 넣을 수 있다는 것도 알고 있습니다> filename.txt

이 작업을 수행하기 위해 루프를 시작하는 방법을 모르겠습니다...

 for each line in filename.txt
 UNAME=...
 LOC=...
 TXT=...
 echo "Username: $UNAME, Line with bad word found: $TXT, and Path and file name: $LOC. Is this a BAD file? (Y)"
 Read YORN

 if ["$YORN" = "Y" ]; then
 >> (line of text from grep) badfiles.txt
 fi

다음이든 뭐든...

필요하다: (적어도) Bomb, Kill, 공백으로 구분된 전체 이름, quit 및 Steal과 같은 나쁜 단어를 찾기 위해 실행되는 스크립트를 만듭니다. 화면에 보고하고 1- 사용자 이름 2- 잘못된 단어가 포함된 줄 3- 경로 및 파일 이름이 표시된 모든 문서를 찾으려면 한 번 실행해야 합니다. 그런 다음 파일이 어디에 있는지 알 수 있도록 스크립트를 변경하거나 뭔가를 수행해야 하며 프로세스 종료 또는 프로그램 종료(플래그 제거)와 같은 합법적인 목적을 가진 파일을 무시해야 합니다.

내가 한 일: 이 단어를 포함하여 테스트할 사용자와 문서를 만들었습니다. 나는 내 스크립트(아래)를 실행하고 명령의 출력을 파일에 넣은 다음 파일을 한 줄씩 반복했습니다. 이제 내가 올바른 방향으로 가고 있는지 확인하기 위해 내 변수를 에코하도록 했습니다.

스크립트:

grep -r -e kill -e Anne -e bomb -e quit -e steal /home/* > /opt/badword.txt

while read line
do
LOC=`echo -e "$line" | cut -d : -f 1`
TXT=`echo -e "$line" | cut -d : -f 2`
UNAME=`echo -e "$line" | cut -d "/" -f 3`
echo $LOC
echo $TXT
echo $UNAME
done <badword.txt

이 스크립트 실행의 화면 출력:

[root@AnneCentOS opt]# ./script4
/home/brownb/doc1
hello my name is xxx i am going to plant a bomb
brownb
/home/brownb/doc2
I want to kill you
brownb
/home/mammaj/doc67
kill process
mammaj
/home/mammaj/doc22
Anne needs to go
mammaj
/home/swiftt/doc
I want to steal a bunch of money so i never have to work again
swiftt
/home/swiftt/doc300
I want to quit this job!
swiftt
[root@AnneCentOS opt]# 

내 badword.txt에서:

/home/brownb/doc1:hello my name is xxx i am going to plant a bomb
/home/brownb/doc2:I want to kill you
/home/mammaj/doc67:kill process
/home/mammaj/doc22:Anne needs to go
/home/swiftt/doc:I want to steal a bunch of money so i never have to work again
/home/swiftt/doc300:I want to quit this job!

마지막으로 각 줄 뒤에 줄을 추가하여 사용자에게 이것이 좋은 파일인지 묻고 싶습니다. 답변 = Y인 경우 if 문을 추가하고 badword.txt에서 해당 줄을 삭제할 수 있습니다. 질문을 만드는 방법을 알고 있는데 if 문에서는 해당 특정 줄을 삭제할 방법이 있는지 알 수 없습니다. 내가 만든 문서에서 .

답변1

몇 가지 팁:

  • 모든 홈 디렉토리를 찾기 위해 /home만 스캔할 계획입니다. 아마도 입문 Linux 과정의 범위를 훨씬 넘어서는 것일 수도 있지만 더 복잡한 설정에는 실제로 적용되지 않습니다. getent passwd조금 더 나을 수도 있지만 확실히 Linux I의 범위를 벗어납니다.

  • 파일에서 나쁜 단어를 찾고 있는지 확실하지 않습니다.이름또는콘텐츠. 이름인 경우 find파일 이름을 검색하는 간단한 방법입니다( find PATHS '(' -iname '*badword1*' -or -iname '*badword2*' -or … ')' -print).

  • 콘텐츠를 보고 있다면 이것이 grep실제로 올바른 선택입니다. -H항상 파일 이름을 인쇄하도록 할 수도 있습니다 . -n(1부터 계산하여 줄 번호 인쇄) 또는 -b(바이트 오프셋 인쇄)도 유용할 수 있습니다. 또는 -l일치하는 파일 이름만 제공됩니다. (또한 모든 파일이 일반 텍스트는 아닙니다. 바이너리 파일의 결과는 이상할 수 있습니다.)

  • 파일에서 읽는 쉘 명령은 입니다 read. 루프 중에 사용자에게 메시지를 표시할 계획이므로 stdin이 아닌 다른 곳에서 읽어야 합니다( 를 전달하여 -u). 일반적으로 while이를 루프에서 사용합니다. 또한 리디렉션은 다음에서 비롯됩니다.뒤쪽에명령 – 이 경우 명령은 전체 루프입니다!

    while read -r -u 5 WORD1 WORD2; do
        true   # do something with $WORD1 and $WORD2 here
    done 5<filename.txt
    
  • 거의 모든 쉘 명령과 마찬가지로 단어 분할 read$IFS. 따라서 로 설정하면 ','쉼표를 기준으로 분할됩니다. ☺ 으로 설정하면 ':'유용할 수 있습니다 .

  • 여러 가지 방법으로 경로를 분할할 수 있습니다. cut완료할 수 basename있으며 dirname특정 부품을 사용할 수 있습니다. 물론 sedawk수는 있지만 너무 과할 수도 있습니다. Bash를 사용하는 경우 확장 확장이 가장 쉽고 빠른 방법입니다. 맨페이지의 "매개변수 확장" 아래에 있습니다. 예를 들어:

    $ foo='/home/bob'
    $ echo "${foo#/home/}"
    bob
    

고쳐 쓰다:

  • 특정 줄을 삭제하는 대신 사용자가 잘못되었다고 생각하는 모든 줄을 포함하는 새 파일을 작성하는 것이 좋습니다. 파일에서 줄을 삭제하는 것과 같은 기능을 사용할 수 있지만 sed실제로는 해당 줄 없이 새 파일을 작성하는 것입니다. 일반적으로 파일 시스템에서는 끝부터 시작하지 않는 한 파일을 줄이는 것을 허용하지 않습니다.

  • 프롬프트는 매우 간단 read하며 옵션도 있습니다. 하지만 5예제에 포함된 모든 내용을 생략했기 때문에 놀라운 결과를 얻게 될 것입니다 .

  • set -x디버깅이 가능한지 확인해보세요 .

관련 정보