{"id":3773,"date":"2015-06-17T13:35:30","date_gmt":"2015-06-17T13:35:30","guid":{"rendered":"http:\/\/www.deuzebranaweb.com.br\/?p=3773"},"modified":"2015-06-17T13:35:30","modified_gmt":"2015-06-17T13:35:30","slug":"3773","status":"publish","type":"post","link":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/2015\/06\/17\/3773\/","title":{"rendered":"grep \u2013 Encontre trechos de c\u00f3digo no terminal do Linux"},"content":{"rendered":"<p>Dia desses, enquanto passava a madrugada trabalhando, percebi que uma das tarefas era encontrar um trecho de c\u00f3digo espec\u00edfico em mais de 2.000 arquivos e substituir por outro trecho de c\u00f3digo.<\/p>\n<p>O problema \u00e9 que n\u00e3o havia qualquer indicador \u00f3bvio de que o c\u00f3digo em quest\u00e3o estaria em qualquer um desses arquivos. Ou seja: eu provavelmente teria que baixar todos para minha m\u00e1quina via<span class=\"Apple-converted-space\">\u00a0<\/span><strong>FTP<\/strong><span class=\"Apple-converted-space\">\u00a0<\/span>e abri-los para encontrar quais arquivos continham esse bendito trecho.\u00a0Foi a\u00ed que eu me lembrei de um comando simples no Linux que pode ser executado no terminal e \u00e9 uma m\u00e3o na roda n\u00e3o s\u00f3 para usu\u00e1rios avan\u00e7ados, mas para qualquer um: o<span class=\"Apple-converted-space\">\u00a0<\/span><strong>grep<\/strong>!<\/p>\n<p><span id=\"more-70876\"><\/span>O grep \u00e9 um comando com uma fun\u00e7\u00e3o simples: ele procura por trechos de texto (strings) dentro de arquivos ou diret\u00f3rios e retorna para voc\u00ea em quais arquivos a string foi encontrada, inclusive mostrando a linha em que isso ocorreu. Parece bobo? Pense novamente: as possibilidades com o grep s\u00e3o quase infinitas, mesmo para usu\u00e1rios comuns, e o uso aumenta muito mais quando voc\u00ea resolve un\u00ed-lo a outros comandos.<\/p>\n<p>Imagine por exemplo que voc\u00ea queira descobrir rapidamente quais foram os \u00faltimos acessos de um n\u00famero IP espec\u00edfico ao servidor. Em vez de abrir o arquivo de log ou usar uma ferramenta, voc\u00ea pode usar o grep no \u00faltimo arquivo de log de acessos. Pronto, ele te retorna na tela os dados.<\/p>\n<p>Ou digamos que voc\u00ea n\u00e3o seja exatamente um usu\u00e1rio muito organizado e agora precisa encontrar onde est\u00e1 uma informa\u00e7\u00e3o importante dentro de um documento perdido em meio a centenas de outros documentos. Use o grep.<\/p>\n<p>Ou, por fim, imagine que voc\u00ea seja um sysadmin que precisa urgentemente dormir pelo menos uma hora que seja e tem quase 2000 arquivos para verificar a exist\u00eancia de um poss\u00edvel trecho de c\u00f3digo. Use o grep, e v\u00e1 dormir mais cedo.<span class=\"Apple-converted-space\">\u00a0<\/span><img decoding=\"async\" class=\"wp-smiley colorbox-70876\" src=\"https:\/\/tecnoblog.net\/wp-includes\/images\/smilies\/simple-smile.png\" alt=\":)\" \/><\/p>\n<p>E como o grep funciona? No<span class=\"Apple-converted-space\">\u00a0<\/span><strong>terminal<\/strong>, voc\u00ea pode digitar, por exemplo:<\/p>\n<p><code>grep \"trecho a procurar\" arquivo.txt<\/code><\/p>\n<p>Ou seja: primeiro o comando<span class=\"Apple-converted-space\">\u00a0<\/span><em>grep<\/em>, logo depois o trecho que voc\u00ea quer encontrar, e por fim o arquivo onde voc\u00ea far\u00e1 a busca. Embora n\u00e3o seja obrigat\u00f3rio colocar o trecho de busca entre aspas, o ideal \u00e9 fazer isso sempre, para que o Linux n\u00e3o acabe se confundindo com a sintaxe do comando.<\/p>\n<p>Mas\u2026 E se eu quiser procurar em v\u00e1rios arquivos, e n\u00e3o apenas em UM arquivos espec\u00edfico? N\u00e3o tema, continua simples:<\/p>\n<p><code>grep \"trecho a procurar\" *<\/code><\/p>\n<p>Com isso, o grep vai procurar o trecho em todos os arquivos do diret\u00f3rio atual. Se voc\u00ea quiser, pode especificar um diret\u00f3rio diferente:<\/p>\n<p><code>grep \"trecho a procurar\" \/var\/www\/*<\/code><\/p>\n<p>Est\u00e1 ficando divertido, mas voc\u00ea ainda pode melhorar, com o uso de algumas op\u00e7\u00f5es de busca. Vamos dizer que voc\u00ea n\u00e3o queira fazer a busca apenas naquele diret\u00f3rio, mas tamb\u00e9m nos subdiret\u00f3rios. Use a op\u00e7\u00e3o -R.<\/p>\n<p><code>grep -R \"trecho a procurar\" \/var\/www\/<\/code><\/p>\n<p>Ele vai procurar o trecho em<span class=\"Apple-converted-space\">\u00a0<\/span><strong>todos<\/strong>\u00a0os arquivos e diret\u00f3rios que estejam dentro de \/var\/www\/. Perceba que, dependendo da quantidade de arquivos e do tamanho deles, isso pode levar alguns minutos ou v\u00e1rias horas. Ent\u00e3o use essa op\u00e7\u00e3o com cuidado. Se voc\u00ea quiser, pode fazer uma busca que n\u00e3o se importe com mai\u00fasculas ou min\u00fasculas usando a op\u00e7\u00e3o -i:<\/p>\n<p><code>grep -i \"trecho a procurar\" arquivo.txt<\/code><\/p>\n<p>Aqui, o grep vai retornar qualquer resultado que bater com o trecho desejado, independente se houverem mai\u00fasculas. Pode ser \u201cTrecho A Procurar\u201d ou \u201cTrReChO a PrOcUrAr\u201d ou qualquer outra combina\u00e7\u00e3o. N\u00e3o far\u00e1 diferen\u00e7a. Mas voc\u00ea tamb\u00e9m pode procurar por todos os arquivos ou linhas onde o trecho<span class=\"Apple-converted-space\">\u00a0<\/span><strong>n\u00e3o<\/strong>\u00a0aparece. Como? Usando a op\u00e7\u00e3o -v<\/p>\n<p><code>grep -v \"trecho a procurar\" arquivo.txt<\/code><\/p>\n<p>Nesse exemplo, o grep vai retornar qualquer linha do arquivo que n\u00e3o contenha o texto selecionado. Interessante, n\u00e3o? E d\u00e1 para juntar todas essas op\u00e7\u00f5es? Claro que d\u00e1!<\/p>\n<p><code>grep -Riv \"trecho a procurar\" \/var\/www\/<\/code><\/p>\n<p>J\u00e1 ficou f\u00e1cil de entender o que essa combina\u00e7\u00e3o faz, n\u00e3o? Procura recursivamente dentro da pasta \/var\/www por todos os arquivos e linhas onde o trecho selecionado n\u00e3o foi encontrado, independente dele ter partes em mai\u00fasculas ou min\u00fasculas.<\/p>\n<p>Podemos melhorar? Podemos. E se o trecho que quisermos procurar existir em muitos arquivos e acabar \u201cestourando\u201d o limite de caracteres do terminal? Ou, melhor: e se quisermos passar o resultado para outra pessoa? \u00c9 s\u00f3 jogar a sa\u00edda do grep para um arquivo:<\/p>\n<p><code>grep \"trecho\" arquivo.txt &gt; arquivodesaida.txt<\/code><\/p>\n<p>Todo o resultado do grep ir\u00e1 para o arquivodesaida.txt, e n\u00e3o para a tela. Assim, voc\u00ea poder\u00e1 ler com calma, imprimir, enviar para algu\u00e9m, ou at\u00e9 usar em algum outro script. Outra possibilidade \u00e9 usar o grep para filtrar a sa\u00edda de<span class=\"Apple-converted-space\">\u00a0<\/span><strong>outros<\/strong>\u00a0comandos. Vamos dizer que eu precise listar a sa\u00edda do comando<span class=\"Apple-converted-space\">\u00a0<\/span><em>ls<\/em><span class=\"Apple-converted-space\">\u00a0<\/span>(muito \u00fatil se voc\u00ea est\u00e1 procurando algo espec\u00edfico em uma pasta com muitos arquivos):<\/p>\n<p><code>ls | grep trecho<\/code><\/p>\n<p>E pronto. O<span class=\"Apple-converted-space\">\u00a0<\/span><em>ls<\/em><span class=\"Apple-converted-space\">\u00a0<\/span>vai retornar apenas os arquivos que contenham \u201ctrecho\u201d no nome. Mais f\u00e1cil que isso, s\u00f3 se o estagi\u00e1rio fizer pra voc\u00ea!<span class=\"Apple-converted-space\">\u00a0<\/span><img decoding=\"async\" class=\"wp-smiley colorbox-70876\" src=\"https:\/\/tecnoblog.net\/wp-includes\/images\/smilies\/simple-smile.png\" alt=\":)\" \/><\/p>\n<p>O grep \u00e9 uma ferramente poderosa, e aqui cobrimos apenas o b\u00e1sico dela. Se voc\u00ea quiser saber mais, leia o<span class=\"Apple-converted-space\">\u00a0<\/span><a href=\"http:\/\/unixhelp.ed.ac.uk\/CGI\/man-cgi?grep\" target=\"_blank\">manual do comando<\/a>, e brinque um pouco na sua instala\u00e7\u00e3o Linux. Voc\u00ea vai descobrir possibilidades que tornar\u00e3o sua vida muito mais f\u00e1cil.<span class=\"Apple-converted-space\">\u00a0<\/span><img decoding=\"async\" class=\"wp-smiley colorbox-70876\" src=\"https:\/\/tecnoblog.net\/wp-includes\/images\/smilies\/simple-smile.png\" alt=\":)\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>https:\/\/tecnoblog.net\/70876\/grep-tutorial-linux-codigo\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dia desses, enquanto passava a madrugada trabalhando, percebi que uma das tarefas era encontrar um trecho de c\u00f3digo espec\u00edfico em mais de 2.000 arquivos e substituir por outro trecho de c\u00f3digo. O problema \u00e9 que n\u00e3o havia qualquer indicador \u00f3bvio de que o c\u00f3digo em&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_angie_page":false,"page_builder":"","footnotes":""},"categories":[18],"tags":[],"class_list":["post-3773","post","type-post","status-publish","format-standard","hentry","category-comandos-linux"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/3773","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=3773"}],"version-history":[{"count":0,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/3773\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=3773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=3773"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=3773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}