Como usar o comando grep para pesquisar todos os Urls em um arquivo de banco de dados, exceto hyperlinks e http://www.example.com e armazená-lo em um arquivo diferente

1

Eu tenho um arquivo de banco de dados chamado prod_database.sql e queria pesquisar todos os URLs nesse arquivo, exceto os hiperlinks * e o link e queria armazena os resultados em um arquivo.
Padrão de hiperlinks *: <a href="http://www.hyperlink.com"></a> Suponha que eu tenha um arquivo prod_database.sql que têm conteúdo abaixo

<html>
    <head>
    <script src="http://www.script.com/javascript1.js"><linkhref="http://www.css.com/style.css">
    </head>
    <body>
    Hello Anwar<br/>
    <a href="http://www.anchortag.com">Google</a><br/>
    <iframe src="http://www.iframe.com"></iframe></body></html>

EntãoeutenhoquepesquisartodasasURLsquenãofazempartedastagsdeâncora(hyperlinks)noarquivoacimaeudeveriaterURLdeSomente<script>,<link>etagiframeresultadoesperado: link , link , link

    
por Mohammad Anwar 06.06.2017 / 23:17

2 respostas

1

O seguinte é meio feio, mas parece fazer o que você quer:

cat prod_database.sql | grep -Ev "<a href=\".*\">.*<\/a>" | grep -E "<.*=\"http:" | sed -r 's/^<.*=\"http/http/' | sed -r 's/\">.*$//'
http://www.script.com/javascript1.js
http://www.css.com/style.css
http://www.iframe.com

Para armazená-lo em um arquivo, basta redirecioná-lo para algo que você deseja assim:

cat prod_database.sql | grep -Ev "<a href=\".*\">.*<\/a>" | grep -E "<.*=\"http:" | sed -r 's/^<.*=\"http/http/' | sed -r 's/\">.*$//' > somefile.txt

Este é o conteúdo:

cat somefile.txt 
http://www.script.com/javascript1.js
http://www.css.com/style.css
http://www.iframe.com

Como alternativa, alterne para a sintaxe / método alternativo com o seguinte (como o user1133275 mencionou):

cat prod_database.sql | grep -Ev "<a href=\".*\">.*<\/a>" | grep -E "<.*=\"http:" | perl -pe 's/^<.*=\"http/http/' | perl -pe 's/\">.*$//'

Para armazená-lo em um arquivo, basta redirecioná-lo para algo que você deseja assim (com a sintaxe atualizada):

cat prod_database.sql | grep -Ev "<a href=\".*\">.*<\/a>" | grep -E "<.*=\"http:" | perl -pe 's/^<.*=\"http/http/' | perl -pe 's/\">.*$//' > somefile.txt
    
por 09.06.2017 / 17:43
1

Usando grep com -P opção

grep -o -P '(?!<.*?(?<!(href))=")https?:\/\/(?!(www\.example\.com)).*?(?=(">))' input.txt > output.txt

O comando lê o arquivo input.txt e grava no arquivo output.txt . Altere os nomes dos arquivos de acordo com suas necessidades.

Teste

input.txt (compliquei um pouco seu exemplo)

<html>
<head>
<script src="http://www.script.com/javascript1.js"><scriptsrc="http://www.script.com/javascript2.js">

<link href="http://www.css.com/style.css">one <a><a href="http://www.anchortag.com">Google</a><br/>
</head>
<body>
Hello Anwar<br/><script src="https://www.script.com/javascript3.js"><scriptsrc="http://www.script.com/javascript4.js">

<a href="http://www.anchortag.com">Google</a><br/>some words<a href="http://www.anchortag.com">Google</a><br/>

<iframe src="http://www.example.com"></iframe><br><br><iframesrc="http://www.iframe.com"></iframe>
<iframe src="https://www.some_site1.com"></iframe><iframesrc="https://www.some_site2.com"></iframe>
</body>
</html>

output.txt

http://www.script.com/javascript1.js
http://www.script.com/javascript2.js
http://www.css.com/style.css
http://www.anchortag.com
https://www.script.com/javascript3.js
http://www.script.com/javascript4.js
http://www.anchortag.com
http://www.anchortag.com
http://www.iframe.com
https://www.some_site1.com
https://www.some_site2.com
    
por 14.06.2017 / 22:11