Como formatar meu arquivo de texto para substiuir grupos de palavras por palavras simples? [RESOLVID

1. Como formatar meu arquivo de texto para substiuir grupos de palavras por palavras simples? [RESOLVID

Luiz Carlos
luizcarlos18rj

(usa Suse)

Enviado em 25/08/2015 - 15:53h






Oi Galera...

Eu tenho uma lista com nomes de sistemas operacionais ( que se repetem ), então pra mostrar a vcs tirei as redundâncias e sobrou:
<code>
Cisco IOS 12.X
Linux 2.6.X|3.X
Linux 2.6.X
3Com embedded, Cisco embedded, Allied Telesis
Microsoft Windows XP|2003
3Com embedded, Huawei VRP 3.X
3Com embedded
Microsoft Windows 2008|7
iPXE 1.X, Linksys Linux 2.4.X, Linux
Microsoft Windows 2000|XP
Microsoft Windows 7|2008|8.1
Microsoft Windows 7|8|Vista|2008
Microsoft Windows 2008|7|Phone|Vista
Microsoft Windows XP|2003
Microsoft Windows Vista|2008|7
Microsoft Windows 2008|7|Phone|Vista
Schweitzer Engineering embedded
Cisco embedded
Microsoft Windows XP
</code>

Gostaria de formatar essa lista somente com shellscript de modo que acontecesse isso:

1 - Todas as linhas que aparecem "XP" se tornariam "Windows XP", ex:


Microsoft Windows XP|2003 ======================> Windows XP
Microsoft Windows 2000|XP ======================> Windows XP
Microsoft Windows XP|2003 ======================> Windows XP
Microsoft Windows XP ======================> Windows XP

2 - Todas as Linhas que aparecem "7" se tornariam "Windows 7", ex:

Microsoft Windows 2008|7 ======================> Windows 7
Microsoft Windows 7|2008|8.1 ===================> Windows 7
Microsoft Windows 7|8|Vista|2008 ===============> Windows 7
Microsoft Windows 2008|7|Phone|Vista ===========> Windows 7
Microsoft Windows Vista|2008|7 =================> Windows 7

3 - Todas as linhas que aparecem "Linux" se tornariam GNU/LINUX, ex.

Linux 2.6.X|3.X ======================> GNU/LINUX
Linux 2.6.X ==========================> GNU/LINUX
iPXE 1.X, Linksys Linux 2.4.X, Linux ===> GNU/LINUX

4 - Todas as demais ( Cisco, 3com, Schweitzer), se tornasem "S.O ROUTER"

Cisco IOS 12.X ======================================> S.O ROTEADOR
3Com embedded, Cisco embedded, Allied Telesis =======> S.O ROTEADOR
3Com embedded, Huawei VRP 3.X =====================-=> S.O ROTEADOR
3Com embedded ======================================> S.O ROTEADOR
Schweitzer Engineering embedded =====================> S.O ROTEADOR
Cisco embedded ======================================> S.O ROTEADOR

Deste modo a lista original se tornaria assim:

- Original

<code>
1 Cisco IOS 12.X
2 Linux 2.6.X|3.X
3 Linux 2.6.X
4 Linux 2.6.X|3.X
5 3Com embedded, Cisco embedded, Allied Telesis
6 3Com embedded, Cisco embedded, Allied Telesis
7 Linux 2.6.X
8 Linux 2.6.X
9 Microsoft Windows XP|2003
10 3Com embedded, Huawei VRP 3.X
11 3Com embedded, Huawei VRP 3.X
12 3Com embedded, Huawei VRP 3.X
13 3Com embedded, Huawei VRP 3.X
14 3Com embedded, Huawei VRP 3.X
15 3Com embedded
16 Linux 2.6.X
17 Microsoft Windows 2008|7
18 iPXE 1.X, Linksys Linux 2.4.X, Linux
19 iPXE 1.X, Linksys Linux 2.4.X, Linux
20 Linux 2.6.X
21 Linux 2.6.X
22 Microsoft Windows 2000|XP
23 Microsoft Windows 7|2008|8.1
24 Microsoft Windows 7|8|Vista|2008
25 Microsoft Windows 2008|7|Phone|Vista
26 Microsoft Windows 2008|7|Phone|Vista
27 Microsoft Windows 2000|XP
28 Microsoft Windows XP|2003
29 Microsoft Windows 7|2008|8.1
30 Microsoft Windows 2008|7|Phone|Vista
31 Microsoft Windows XP|2003
32 Microsoft Windows 2008|7|Phone|Vista
33 Linux 2.6.X|3.X
34 Microsoft Windows 7|8|Vista|2008
35 Microsoft Windows Vista|2008|7
36 Microsoft Windows 2008|7|Phone|Vista
37 Microsoft Windows 7|8|Vista|2008
38 Microsoft Windows XP|2003
39 Microsoft Windows 2008|7
40 Microsoft Windows 2008|7|Phone|Vista
41 Microsoft Windows 2008|7|Phone|Vista
42 Schweitzer Engineering embedded
43 Microsoft Windows 7|2008|8.1
44 Microsoft Windows XP|2003
45 Microsoft Windows XP|2003
46 Cisco embedded
47 Microsoft Windows XP
</code>

Formatado:
<code>
1 S.O ROTEADOR
2 GNU/LINUX
3 GNU/LINUX
4 GNU/LINUX
5 S.O ROTEADOR
6 S.O ROTEADOR
7 GNU/LINUX
8 GNU/LINUX
9 Windows XP
10 S.O ROTEADOR
11 S.O ROTEADOR
12 S.O ROTEADOR
13 S.O ROTEADOR
14 S.O ROTEADOR
15 S.O ROTEADOR
16 GNU/LINUX
17 Windows 7
18 GNU/LINUX
19 GNU/LINUX
20 GNU/LINUX
21 GNU/LINUX
22 Windows XP
23 Windows 7
24 Windows 7
25 Windows 7
26 Windows 7
27 Windows XP
28 Windows XP
29 Windows 7
30 Windows 7
31 Windows XP
32 Windows 7
33 GNU/LINUX
34 Windows 7
35 Windows 7
36 Windows 7
37 Windows 7
38 Windows XP
39 Windows 7
40 Windows 7
41 Windows 7
42 S.O ROTEADOR
43 Windows 7
44 Windows XP
45 Windows XP
46 S.O ROTEADOR
47 Windows XP
</code>

Sou bem iniciante mesmo no mundo linux, mas to correndo atrás
Alguém sabe dizer se é possível? Se sim como? queria fazer um script que fizesse essa tarefa automaticamente...

Desde já agradeço...


  


2. MELHOR RESPOSTA

Patrick Silva
ps-martins

(usa Debian)

Enviado em 25/08/2015 - 17:02h

Use o comando sed primeiramente .. exemplo :

sed -e 's/XP/WINDOWS XP/g' nome_arquivo

-> substituir o que estiver escrito XP por Windows Xp no arquivo ----.

a saída -e não altera o arquivo, apenas vai alterar a saída, mas o arquivo fica intacto .

se quiser alterar use a opção -i

sed -i 's/XP/WINDOWS XP/g' nome_arquivo .

ou se preferir -> sed -e 's/XP/WINDOWS XP/g' nome_arquivo > nome_novo_arquivo.txt

3. Obrigado pela ajuda

Luiz Carlos
luizcarlos18rj

(usa Suse)

Enviado em 25/08/2015 - 20:04h

muito obrigado pela atenção ps-martins...

gostaria apenas de tirar mais uma dúvida:

O comando que vc recomendou, vai apenas trocar uma "palavra" por outra, ou vai trocar a linha toda ( conjunto de palavras)?

Para exemplificar melhor:

O comando sed -i 's/XP/WINDOWS XP/g' nome_arquivo quando se aplicar a seguinte linha:

22 Microsoft Windows 2000|XP

Como será a saída?

a) 22 Windows XP ===> trocou toda a linha " Microsoft + Windows + 2000 +| +XP" pelo termo Windows XP

ou

b) 22 Microsoft Windows 2000|Windows XP ===> trocou apenas a palavra "XP" pelo termo Windows XP, mantendo as outras palavras?

Pergunto isso pq quanto lancei a pergunta tava numa máquina linux, e agora não tenho como testar...

Desde já agradeço...




4. Re: Como formatar meu arquivo de texto para substiuir grupos de palavras por palavras simples? [RESOLVID

Patrick Silva
ps-martins

(usa Debian)

Enviado em 25/08/2015 - 20:13h

Vai alterar tudo que for relacionado a XP para Windows Xp, mas se quiser também pode alterar apenas determinadas linhas .. Segue o exemplo prático aqui :

cat << eof > teste.txt
> XP
> XP
> XP
> 7
> 7
>XP
> 7
> eof

foi criado o arquivo teste.txt

cat teste.txt
XP
XP
XP
7
7
XP
7

sed -e 's/XP/WINDOWS XP/g' teste.txt
saída ->
WINDOWS XP
WINDOWS XP
WINDOWS XP
7
7
WINDOWS XP
7

sed -e 's/7/Windows 7/g' teste.txt
saída ->
XP
XP
XP
Windows 7
Windows 7
XP
Windows 7

Qualquer dúvidas a disposição .




5. Re: Como formatar meu arquivo de texto para substiuir grupos de palavras por palavras simples? [RESOLVID

Patrick Silva
ps-martins

(usa Debian)

Enviado em 25/08/2015 - 20:16h

Minha dica é apenas essa, use o -e primeiramente para não alterar o arquivo original,
se caso for isso mesmo que você quer, use a opção -i para alterar, ou -e , e no final crie uma saída pra criar um
novo arquivo sed -e 's/xp/widows xp/g' > arquivo_novo.txt


6. Re: Como formatar meu arquivo de texto para substiuir grupos de palavras por palavras simples?

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 25/08/2015 - 21:50h

Olá,

Existem algumas formas de fazer isso, as que usaria seriam:

1 ) Em um só comando:

sed -ri '/[Xx][Pp]/ s/.*/Microsoft Windows XP/g;/Windows (2008|[78]|Vista)/ s/.*/Windows 7/g; /[Ll]inux/ s/.*/GNU\/LINUX/g; /(Cisco|3[Cc]om|Schweitzer)/ s/.*/S.O ROTEADOR/g' lista.txt 


2 ) Com script sed:

Crie um arquivo, cole e salve o conteúdo abaixo: (pode chamar como quiser, mas aqui vamos chamar de limpa.sed):
/[Xx][Pp]/ s/.*/Microsoft Windows XP/g
/Windows (2008|[78]|Vista)/ s/.*/Windows 7/g
/[Ll]inux/ s/.*/GNU\/LINUX/g
/(Cisco|3[Cc]om|Schweitzer)/ s/.*/S.O ROTEADOR/g


Depois execute o comando abaixo
sed -rif limpa.sed lista.txt 



OBS1::::::: Substitua lista.txt pelo nome do arquivo que contenha a lista que precisar tratar.

OBS2::::::: Os comandos acima irão realizar as modificações no arquivo original. Portanto, caso precise do antigo, fá uma cópia antes ou redirecione para outro arquivo ( retirando a opção -i e adicionado ao final do comando > arquivo.final)

Abs

---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---


7. Re: Como formatar meu arquivo de texto para substiuir grupos de palavras por palavras simples? [RESOLVID

Luiz Carlos
luizcarlos18rj

(usa Suse)

Enviado em 28/08/2015 - 15:02h

Obrigado a todos, ps-martins e tonyhts

Coma dica de vcs, realmente funcionou a transformação das linhas de um nome para outro...e gostaria de perguntar uma última coisa para que o arquivo fique bem formatado.

Utilizei o comando paste para colar esse o arquivo com a lista que contem mac, ip e S.O ( já tratado ) das máquinas junto com outro arquivo de lista com o nome dessas estações, vindo da saída do comando nbtscan.

Após tratar essa saída eu concatenei essas duas listas com o comando "join" ( tipo um banco de dados primitivo ) que alinha essas duas listas baseadas num índice comum e o arquivo ficou assim:


075 10.3.48.75 E4:11:5B:A6:7F:DD Windows 7 C052M567
077 10.3.48.77 6C:62:6D:B7:A0:8A ROUTER S.O C0632M563
078 10.3.48.78 E4:11:5B:A6:85:27 Windows 7
081 10.3.48.81 00:22:64:E4:AA:11 Windows XP
084 10.3.48.84 00:1D:60:46:20:99 Windows XP
088 10.3.48.88 E4:11:5B:A6:82:64 ROUTER S.O C06M588
093 10.3.48.93 00:1A:4D:AD:C1:FD Windows XP
094 10.3.48.94 00:50:FC:C5:1D:5B
096 10.3.48.96 18:A9:05:B1:DA:12
097 10.3.48.97 18:A9:05:B1:DD:CD
098 10.3.48.98 18:A9:05:B1:DD:CA
099 10.3.48.99 18:A9:05:B1:DA:15 C5224M472
105 10.3.48.105 00:01:02:0A:92:C1
107 10.3.48.107 E4:11:5B:A6:87:A6
108 10.3.48.108 18:A9:05:B1:DE:C7
115 10.3.48.115 00:1F:C6:67:54:8F
123 10.3.48.123 3C:D9:2B:6C:30:10 C33A1M574
124 10.3.48.124 00:1F:D0:FB:28:12 44_M391
125 10.3.48.125 E4:11:5B:A6:85:05 C5211M585


Como podem ver, as linhas sem sistema operacional detectado ficaram em branco e na colagem com o paste a tabulação não ficou perfeita, vcs sabem me dizer como trato com o sed para que linhas cuja coluna onde deveria tá escrito o sistema operacional, estiver em branco ganhem uma tabulação a mais ou como eu posso inserir nesses casos a expressão "NOT DETECTED", para que as colunas fiquem alinhadas e certas?


8. Re: Como formatar meu arquivo de texto para substiuir grupos de palavras por palavras simples? [RESOLVID

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 28/08/2015 - 17:16h

Olá,

O problema são os espaços. Execute o comando abaixo no ultimo arquivo que postou como exemplo.
sed  -ri 's/ {15}/&\t/g' arquivo_espaçado 




abs
---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---


9. Problema resolvido.

Luiz Carlos
luizcarlos18rj

(usa Suse)

Enviado em 31/08/2015 - 10:59h

Obrigado a todos pela ajuda...







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts