Bash scripting para digitalizar arquivos para palavras e criar relatório

3

Ok, sim, este é um trabalho de casa, MAS NÃO estou querendo ter as respostas que me foram dadas.

O cenário é que eu preciso de um script que pesquise todos os diretórios home de meus usuários por palavrões. Eu preciso do script para reportar à tela certas informações como nome de usuário e palavra encontrados e caminho. Ele deve perguntar a um usuário se ele é bom ou ruim e se ele deve ser colocado em um arquivo de lista de nomes de arquivos inválidos, se for bom, remova da lista e não seja mais sinalizado pelo script.

O que eu tenho até agora é querer de alguma forma fazer um loop. Eu sei que se eu fizer um grep -r -e kill -e steal /home/* eu recebo uma lista do que eu preciso. Eu também sei que a lista é separada por delimitadores que eu posso canalizar para obter uma variável para as coisas que eu preciso. Eu também sei que posso colocá-lo em um arquivo com > filename.txt

O que eu não tenho ideia é como iniciar um loop que faria isso ...

 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

Próximo ou o que quer que vá lá ...

Os Requisitos : Crie um script para ser executado para procurar por palavrões como (no mínimo) bomba, matar, nosso nome completo separado por um espaço, sair e roubar. Você deve executar uma vez para se reportar à tela e encontrar todos os documentos para mostrar 1- Username 2- Line contendo bad word e 3-path e filename. Então, devemos alterar nosso script ou fazer algo para que possamos saber onde os arquivos estão, então, para ignorar os arquivos com usos legítimos, por exemplo, kill process ou sair de um programa (remove um flag)

O que eu fiz: criei usuários e documentos para testar incluindo essas palavras. Eu corri meu script (abaixo) e coloquei a saída do meu comando em um arquivo, em seguida, percorro o arquivo linha por linha. Por enquanto eu só tenho que ecoar minhas variáveis para ver se estou no caminho certo ...

SCRIPT:

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

SAÍDA NO ECRÃ DE EXECUTAR ESTE SCRIPT:

[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]# 

NO MEU 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!

Finalmente eu quero adicionar uma linha após cada linha para perguntar ao usuário se este é um bom arquivo? Eu quero adicionar uma declaração if que, se a resposta = Y, então eu posso remover a linha de badword.txt, eu acho que sei como criar a questão e se a declaração só não sei se há uma maneira de remover um específico linha do documento que criei.

    
por Anne 06.03.2015 / 16:57

1 resposta

3

Um par de ponteiros:

  • Você está planejando apenas digitalizar / home para encontrar todos os diretórios home. Provavelmente está bem além da classe Intro to Linux, mas isso não funciona em configurações mais complicadas. getent passwd pode ser um pouco melhor, mas de novo certamente além do Linux I.

  • Não estou completamente claro se você está procurando palavras impróprias no arquivo nomes ou no conteúdo . Se os nomes, find é uma maneira fácil de pesquisar nomes de arquivos ( find PATHS '(' -iname '*badword1*' -or -iname '*badword2*' -or … ')' -print )

  • Se você está procurando no conteúdo, grep é de fato o caminho a percorrer. Você provavelmente vai querer que -H faça sempre que o nome do arquivo seja impresso. -n (número da linha de impressão, contando a partir de 1) ou -b (offset de byte de impressão) também pode ser útil. Como alternativa, -l fornecerá apenas os nomes de arquivos correspondentes. (Além disso, nem todos os arquivos são texto puro; os resultados podem ser estranhos em arquivos binários).

  • O comando shell para ler de um arquivo é read . Como você planeja solicitar ao usuário durante o loop, você terá que ler em algum lugar diferente de stdin (passando -u ). Normalmente, você o usaria em um loop while . Além disso, observe que o redirecionamento vem após o comando - nesse caso, o comando é todo o loop!

    while read -r -u 5 WORD1 WORD2; do
        true   # do something with $WORD1 and $WORD2 here
    done 5<filename.txt
    
  • A divisão do Word é feita por read com base em $IFS , como quase todos os comandos do shell. Então, se você definir como ',' , ele será dividido com base em vírgulas. Se você definir como ':' , isso pode ser útil ☺.

  • Você pode separar caminhos usando uma variedade de métodos. cut pode fazer isso, basename e dirname obtêm peças específicas. O sed e o awk também podem fazê-lo, mas são provavelmente excessivos. Se você estiver usando o Bash, sua expansão estendida é a maneira mais fácil (e rápida). Está na página man em "Parameter Expansion". Por exemplo:

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

Atualização:

  • Em vez de remover uma linha específica, sugiro que você apenas escreva um novo arquivo com todas as linhas que o usuário disse que não são aceitáveis. Você pode usar algo como sed para excluir uma linha de um arquivo, mas (nos bastidores) está realmente escrevendo um novo arquivo sem a linha. De modo geral, os sistemas de arquivos não permitem encurtar um arquivo, exceto no final.

  • O prompt é bastante fácil, read tem uma opção para isso. Mas você vai obter um resultado surpreendente, já que você deixou de fora todas as coisas 5 que eu tinha no meu exemplo.

  • Confira set -x para depuração.

por 06.03.2015 / 19:09