Discussion:
[shell-script] Parâmetro -d com TAB do comando cut
wagnerbrasileirocardoso@yahoo.com.br [shell-script]
2017-02-16 15:14:49 UTC
Permalink
Boa tarde pessoal, sei que parece meio patética minha dúvida e estou meio enferrujado em Bash, mas já revisei o histórico do grupo e pesquisei na internet e todos são categóricos em afirmar que se quer fazer cut baseado nos delimitadores TABs é só ocultar a opção "-d" pois o TAB é o delimitador natural do Bash, porém não funciona como eu esperava... Já tentei direto com a saída do comando ou enviando a saíta para um arquivo e depois a enviando ao cut e ele simplesmente é indiferente, não visualizo onde estou errando:


***@debian-backup-teste:/home/wagner# cat teste.out| cut -f6
total 128
drwxr-xr-x 20 wagner wagner 4096 Fev 16 13:01 .
drwxr-xr-x 3 root root 4096 Fev 14 12:47 ..
drwxr-xr-x 2 wagner wagner 4096 Fev 14 12:51 Área de trabalho
-rw------- 1 wagner wagner 40 Fev 15 12:44 .bash_history
-rw-r--r-- 1 wagner wagner 220 Fev 14 12:47 .bash_logout
-rw-r--r-- 1 wagner wagner 3515 Fev 14 12:47 .bashrc
drwx------ 8 wagner wagner 4096 Fev 14 15:29 .cache
drwx------ 12 wagner wagner 4096 Fev 15 12:39 .config
drwx------ 3 wagner wagner 4096 Fev 14 12:51 .dbus




Minha idéia é pegar o 6⁰ campo, para isso usei o cut -f6 e nada... Ele mostra exatamente como era o arquivo.
Sei que deve ser possível resolver com print ou awk, mas agora queria entender esse erro...



Att,


Wagner Brasileiro
Jonathan Lessa jonathanlessa@gmail.com [shell-script]
2017-02-16 15:35:54 UTC
Permalink
Boa tarde!

Confirme se os espaços são realmente tabulações ou espaços em branco juntos.
Seu exemplo aparenta ser uma saída do "ls -la" e essa saída é com espaços
em branco e não tabulações.
use o cut -d' ' -f3 pra ser se a saída é diferente, sendo vc deve tratar a
ocorrência de espaços em branco juntos como únicos.
Post by ***@yahoo.com.br [shell-script]
Boa tarde pessoal, sei que parece meio patética minha dúvida e estou meio
enferrujado em Bash, mas já revisei o histórico do grupo e pesquisei na
internet e todos são categóricos em afirmar que se quer fazer cut baseado
nos delimitadores TABs é só ocultar a opção "-d" pois o TAB é o delimitador
natural do Bash, porém não funciona como eu esperava... Já tentei direto
com a saída do comando ou enviando a saíta para um arquivo e depois a
enviando ao cut e ele simplesmente é indiferente, não visualizo onde estou
total 128
drwxr-xr-x 20 wagner wagner 4096 Fev 16 13:01 .
drwxr-xr-x 3 root root 4096 Fev 14 12:47 ..
drwxr-xr-x 2 wagner wagner 4096 Fev 14 12:51 Área de trabalho
-rw------- 1 wagner wagner 40 Fev 15 12:44 .bash_history
-rw-r--r-- 1 wagner wagner 220 Fev 14 12:47 .bash_logout
-rw-r--r-- 1 wagner wagner 3515 Fev 14 12:47 .bashrc
drwx------ 8 wagner wagner 4096 Fev 14 15:29 .cache
drwx------ 12 wagner wagner 4096 Fev 15 12:39 .config
drwx------ 3 wagner wagner 4096 Fev 14 12:51 .dbus
Minha idéia é pegar o 6⁰ campo, para isso usei o cut -f6 e nada... Ele
mostra exatamente como era o arquivo.
Sei que deve ser possível resolver com print ou awk, mas agora queria
entender esse erro...
Att,
Wagner Brasileiro
--
Att.:
Jonathan Lessa
Licenciado em Informática
itamarnet@yahoo.com.br [shell-script]
2017-02-16 15:57:31 UTC
Permalink
Wagner o que o Jonathan disse está correto, a saída do comando ls faz o alinhamento com espaços e não usa tabulação.

E realmente o cut usar por padrão tabulação como separador de campo por padrão, exceto quando se declara explicitamente usando a opção '-d'.

Para contornar a questão do espaços em branco consecutivo pode usar o comando 'tr' junto, por exemplo:


$ ls -la | tr -s ' ' | cut -d ' ' -f6


ou usar awk, que por padrão usa espaços/ou tabulações consecutivos como separador padrão:


$ ls -la | awk '{ print $6 }'




[]'s
Itamar
Wagner Brasileiro wagnerbrasileirocardoso@yahoo.com.br [shell-script]
2017-02-16 17:47:49 UTC
Permalink
Obrigado a todos, tanto o modelo com AWK quanto o próprio CUT com o arquivo teste tabular que montei funcionou!

De: "***@yahoo.com.br [shell-script]" <shell-***@yahoogrupos.com.br>
Para: shell-***@yahoogrupos.com.br
Enviadas: Quinta-feira, 16 de Fevereiro de 2017 13:57
Assunto: Re: [shell-script] Parâmetro -d com TAB do comando cut

  Wagner o que o Jonathan disse está correto, a saída do comando ls faz o alinhamento com espaços e não usa tabulação.
E realmente o cut usar por padrão tabulação como separador de campo por padrão, exceto quando se declara explicitamente usando a opção '-d'.
Para contornar a questão do espaços em branco consecutivo pode usar o comando 'tr' junto, por exemplo:
$ ls -la | tr -s ' ' | cut -d ' ' -f6
ou usar awk, que por padrão usa espaços/ou tabulações consecutivos como separador padrão:
$ ls -la | awk '{ print $6 }'

[]'sItamar #yiv2994740078 #yiv2994740078 -- #yiv2994740078ygrp-mkp {border:1px solid #d8d8d8;font-family:Arial;margin:10px 0;padding:0 10px;}#yiv2994740078 #yiv2994740078ygrp-mkp hr {border:1px solid #d8d8d8;}#yiv2994740078 #yiv2994740078ygrp-mkp #yiv2994740078hd {color:#628c2a;font-size:85%;font-weight:700;line-height:122%;margin:10px 0;}#yiv2994740078 #yiv2994740078ygrp-mkp #yiv2994740078ads {margin-bottom:10px;}#yiv2994740078 #yiv2994740078ygrp-mkp .yiv2994740078ad {padding:0 0;}#yiv2994740078 #yiv2994740078ygrp-mkp .yiv2994740078ad p {margin:0;}#yiv2994740078 #yiv2994740078ygrp-mkp .yiv2994740078ad a {color:#0000ff;text-decoration:none;}#yiv2994740078 #yiv2994740078ygrp-sponsor #yiv2994740078ygrp-lc {font-family:Arial;}#yiv2994740078 #yiv2994740078ygrp-sponsor #yiv2994740078ygrp-lc #yiv2994740078hd {margin:10px 0px;font-weight:700;font-size:78%;line-height:122%;}#yiv2994740078 #yiv2994740078ygrp-sponsor #yiv2994740078ygrp-lc .yiv2994740078ad {margin-bottom:10px;padding:0 0;}#yiv2994740078 #yiv2994740078actions {font-family:Verdana;font-size:11px;padding:10px 0;}#yiv2994740078 #yiv2994740078activity {background-color:#e0ecee;float:left;font-family:Verdana;font-size:10px;padding:10px;}#yiv2994740078 #yiv2994740078activity span {font-weight:700;}#yiv2994740078 #yiv2994740078activity span:first-child {text-transform:uppercase;}#yiv2994740078 #yiv2994740078activity span a {color:#5085b6;text-decoration:none;}#yiv2994740078 #yiv2994740078activity span span {color:#ff7900;}#yiv2994740078 #yiv2994740078activity span .yiv2994740078underline {text-decoration:underline;}#yiv2994740078 .yiv2994740078attach {clear:both;display:table;font-family:Arial;font-size:12px;padding:10px 0;width:400px;}#yiv2994740078 .yiv2994740078attach div a {text-decoration:none;}#yiv2994740078 .yiv2994740078attach img {border:none;padding-right:5px;}#yiv2994740078 .yiv2994740078attach label {display:block;margin-bottom:5px;}#yiv2994740078 .yiv2994740078attach label a {text-decoration:none;}#yiv2994740078 blockquote {margin:0 0 0 4px;}#yiv2994740078 .yiv2994740078bold {font-family:Arial;font-size:13px;font-weight:700;}#yiv2994740078 .yiv2994740078bold a {text-decoration:none;}#yiv2994740078 dd.yiv2994740078last p a {font-family:Verdana;font-weight:700;}#yiv2994740078 dd.yiv2994740078last p span {margin-right:10px;font-family:Verdana;font-weight:700;}#yiv2994740078 dd.yiv2994740078last p span.yiv2994740078yshortcuts {margin-right:0;}#yiv2994740078 div.yiv2994740078attach-table div div a {text-decoration:none;}#yiv2994740078 div.yiv2994740078attach-table {width:400px;}#yiv2994740078 div.yiv2994740078file-title a, #yiv2994740078 div.yiv2994740078file-title a:active, #yiv2994740078 div.yiv2994740078file-title a:hover, #yiv2994740078 div.yiv2994740078file-title a:visited {text-decoration:none;}#yiv2994740078 div.yiv2994740078photo-title a, #yiv2994740078 div.yiv2994740078photo-title a:active, #yiv2994740078 div.yiv2994740078photo-title a:hover, #yiv2994740078 div.yiv2994740078photo-title a:visited {text-decoration:none;}#yiv2994740078 div#yiv2994740078ygrp-mlmsg #yiv2994740078ygrp-msg p a span.yiv2994740078yshortcuts {font-family:Verdana;font-size:10px;font-weight:normal;}#yiv2994740078 .yiv2994740078green {color:#628c2a;}#yiv2994740078 .yiv2994740078MsoNormal {margin:0 0 0 0;}#yiv2994740078 o {font-size:0;}#yiv2994740078 #yiv2994740078photos div {float:left;width:72px;}#yiv2994740078 #yiv2994740078photos div div {border:1px solid #666666;height:62px;overflow:hidden;width:62px;}#yiv2994740078 #yiv2994740078photos div label {color:#666666;font-size:10px;overflow:hidden;text-align:center;white-space:nowrap;width:64px;}#yiv2994740078 #yiv2994740078reco-category {font-size:77%;}#yiv2994740078 #yiv2994740078reco-desc {font-size:77%;}#yiv2994740078 .yiv2994740078replbq {margin:4px;}#yiv2994740078 #yiv2994740078ygrp-actbar div a:first-child {margin-right:2px;padding-right:5px;}#yiv2994740078 #yiv2994740078ygrp-mlmsg {font-size:13px;font-family:Arial, helvetica, clean, sans-serif;}#yiv2994740078 #yiv2994740078ygrp-mlmsg table {font-size:inherit;font:100%;}#yiv2994740078 #yiv2994740078ygrp-mlmsg select, #yiv2994740078 input, #yiv2994740078 textarea {font:99% Arial, Helvetica, clean, sans-serif;}#yiv2994740078 #yiv2994740078ygrp-mlmsg pre, #yiv2994740078 code {font:115% monospace;}#yiv2994740078 #yiv2994740078ygrp-mlmsg * {line-height:1.22em;}#yiv2994740078 #yiv2994740078ygrp-mlmsg #yiv2994740078logo {padding-bottom:10px;}#yiv2994740078 #yiv2994740078ygrp-msg p a {font-family:Verdana;}#yiv2994740078 #yiv2994740078ygrp-msg p#yiv2994740078attach-count span {color:#1E66AE;font-weight:700;}#yiv2994740078 #yiv2994740078ygrp-reco #yiv2994740078reco-head {color:#ff7900;font-weight:700;}#yiv2994740078 #yiv2994740078ygrp-reco {margin-bottom:20px;padding:0px;}#yiv2994740078 #yiv2994740078ygrp-sponsor #yiv2994740078ov li a {font-size:130%;text-decoration:none;}#yiv2994740078 #yiv2994740078ygrp-sponsor #yiv2994740078ov li {font-size:77%;list-style-type:square;padding:6px 0;}#yiv2994740078 #yiv2994740078ygrp-sponsor #yiv2994740078ov ul {margin:0;padding:0 0 0 8px;}#yiv2994740078 #yiv2994740078ygrp-text {font-family:Georgia;}#yiv2994740078 #yiv2994740078ygrp-text p {margin:0 0 1em 0;}#yiv2994740078 #yiv2994740078ygrp-text tt {font-size:120%;}#yiv2994740078 #yiv2994740078ygrp-vital ul li:last-child {border-right:none !important;}#yiv2994740078
Hudson Figueredo hudson@pquilinux.org [shell-script]
2017-02-16 15:55:47 UTC
Permalink
A separação do seu "teste.out" não é <tab> e sim <espaço>
Pode testar criando um arquivo com 1<tab>2<tab>3<tab>...

Usa o awk...

cat teste.out|awk '{print $6}'

Abcs
Post by Jonathan Lessa ***@gmail.com [shell-script]
Boa tarde!
Confirme se os espaços são realmente tabulações ou espaços em branco juntos.
Seu exemplo aparenta ser uma saída do "ls -la" e essa saída é com espaços
em branco e não tabulações.
use o cut -d' ' -f3 pra ser se a saída é diferente, sendo vc deve tratar a
ocorrência de espaços em branco juntos como únicos.
Post by ***@yahoo.com.br [shell-script]
Boa tarde pessoal, sei que parece meio patética minha dúvida e estou meio
enferrujado em Bash, mas já revisei o histórico do grupo e pesquisei na
internet e todos são categóricos em afirmar que se quer fazer cut baseado
nos delimitadores TABs é só ocultar a opção "-d" pois o TAB é o delimitador
natural do Bash, porém não funciona como eu esperava... Já tentei direto
com a saída do comando ou enviando a saíta para um arquivo e depois a
enviando ao cut e ele simplesmente é indiferente, não visualizo onde estou
total 128
drwxr-xr-x 20 wagner wagner 4096 Fev 16 13:01 .
drwxr-xr-x 3 root root 4096 Fev 14 12:47 ..
drwxr-xr-x 2 wagner wagner 4096 Fev 14 12:51 Área de trabalho
-rw------- 1 wagner wagner 40 Fev 15 12:44 .bash_history
-rw-r--r-- 1 wagner wagner 220 Fev 14 12:47 .bash_logout
-rw-r--r-- 1 wagner wagner 3515 Fev 14 12:47 .bashrc
drwx------ 8 wagner wagner 4096 Fev 14 15:29 .cache
drwx------ 12 wagner wagner 4096 Fev 15 12:39 .config
drwx------ 3 wagner wagner 4096 Fev 14 12:51 .dbus
Minha idéia é pegar o 6⁰ campo, para isso usei o cut -f6 e nada... Ele
mostra exatamente como era o arquivo.
Sei que deve ser possível resolver com print ou awk, mas agora queria
entender esse erro...
Att,
Wagner Brasileiro
--
Jonathan Lessa
Licenciado em Informática
--
Hudson G Manieri Figueredo
+55 21 988052751
phfbettega@yahoo.com.br [shell-script]
2017-02-16 17:56:08 UTC
Permalink
Olá Wagner, usando uma dica do mestre Julio dá pra ver se é tab ou espaço.

echo -e '1 2 3 4'|cat -vet
1 2 3 4$

echo -e '1\t2 3\t4'|cat -vet
1^I2 3^I4$

Os tabs \t aparecem como o caracter de controle ^I
Fim de linha como $

Abraços Paulo
Post by ***@yahoo.com.br [shell-script]
Boa tarde pessoal, sei que parece meio patética minha dúvida e estou meio enferrujado em Bash, mas já revisei
o histórico do grupo e pesquisei na internet e todos são categóricos em afirmar que se quer fazer cut baseado
nos delimitadores TABs é só ocultar a opção "-d" pois o TAB é o delimitador natural do Bash, porém não
funciona como eu esperava... Já tentei direto com a saída do comando ou enviando a saíta para um arquivo e
total 128
drwxr-xr-x 20 wagner wagner 4096 Fev 16 13:01 .
drwxr-xr-x 3 root root 4096 Fev 14 12:47 ..
drwxr-xr-x 2 wagner wagner 4096 Fev 14 12:51 Área de trabalho
-rw------- 1 wagner wagner 40 Fev 15 12:44 .bash_history
-rw-r--r-- 1 wagner wagner 220 Fev 14 12:47 .bash_logout
-rw-r--r-- 1 wagner wagner 3515 Fev 14 12:47 .bashrc
drwx------ 8 wagner wagner 4096 Fev 14 15:29 .cache
drwx------ 12 wagner wagner 4096 Fev 15 12:39 .config
drwx------ 3 wagner wagner 4096 Fev 14 12:51 .dbus
Minha idéia é pegar o 6⁰ campo, para isso usei o cut -f6 e nada... Ele mostra exatamente como era o arquivo.
Sei que deve ser possível resolver com print ou awk, mas agora queria entender esse erro...
Att,
Wagner Brasileiro
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
Wagner Brasileiro wagnerbrasileirocardoso@yahoo.com.br [shell-script]
2017-02-16 15:21:18 UTC
Permalink
Boa tarde pessoal, sei que parece meio patética minha dúvida e estou meio enferrujado em Bash, mas já revisei o histórico do grupo e pesquisei na internet e todos são categóricos em afirmar que se quer fazer cut baseado nos delimitadores TABs é só ocultar a opção "-d" pois o TAB é o delimitador natural do Bash, porém não funciona como eu esperava...  Já tentei direto com a saída do comando ou enviando a saíta para um arquivo e depois a enviando ao cut e ele simplesmente é indiferente, não visualizo onde estou errando:
***@debian-backup-teste:/home/wagner# cat teste.out| cut -f6
total 128
drwxr-xr-x 20 wagner wagner  4096 Fev 16 13:01 .
drwxr-xr-x  3 root   root    4096 Fev 14 12:47 ..
drwxr-xr-x  2 wagner wagner  4096 Fev 14 12:51 Área de trabalho
-rw-------  1 wagner wagner    40 Fev 15 12:44 .bash_history
-rw-r--r--  1 wagner wagner   220 Fev 14 12:47 .bash_logout
-rw-r--r--  1 wagner wagner  3515 Fev 14 12:47 .bashrc
drwx------  8 wagner wagner  4096 Fev 14 15:29 .cache
drwx------ 12 wagner wagner  4096 Fev 15 12:39 .config
drwx------  3 wagner wagner  4096 Fev 14 12:51 .dbus

Minha idéia é pegar o 6⁰ campo, para isso usei o cut -f6 e nada... Ele mostra exatamente como era o arquivo.
Sei que deve ser possível resolver com print ou awk, mas agora queria entender esse erro...

Att,
Wagner Brasileiro
Alfredo Casanova atcasanova@gmail.com [shell-script]
2017-02-22 19:35:21 UTC
Permalink
faça um

$ cat -vet teste.out

assim vc poderá ver se o arquivo está, de fato, separado por TABS. Eu
acredito que, por ser uma saída de ls, não está.
Na saída do cat -vet o tab é representado por ^I

On Thu, Feb 16, 2017 at 7:26 PM Wagner Brasileiro
Post by ***@yahoo.com.br [shell-script]
Boa tarde pessoal, sei que parece meio patética minha dúvida e estou meio
enferrujado em Bash, mas já revisei o histórico do grupo e pesquisei na
internet e todos são categóricos em afirmar que se quer fazer cut baseado
nos delimitadores TABs é só ocultar a opção "-d" pois o TAB é o delimitador
natural do Bash, porém não funciona como eu esperava... Já tentei direto
com a saída do comando ou enviando a saíta para um arquivo e depois a
enviando ao cut e ele simplesmente é indiferente, não visualizo onde estou
total 128
drwxr-xr-x 20 wagner wagner 4096 Fev 16 13:01 .
drwxr-xr-x 3 root root 4096 Fev 14 12:47 ..
drwxr-xr-x 2 wagner wagner 4096 Fev 14 12:51 Área de trabalho
-rw------- 1 wagner wagner 40 Fev 15 12:44 .bash_history
-rw-r--r-- 1 wagner wagner 220 Fev 14 12:47 .bash_logout
-rw-r--r-- 1 wagner wagner 3515 Fev 14 12:47 .bashrc
drwx------ 8 wagner wagner 4096 Fev 14 15:29 .cache
drwx------ 12 wagner wagner 4096 Fev 15 12:39 .config
drwx------ 3 wagner wagner 4096 Fev 14 12:51 .dbus
Minha idéia é pegar o 6⁰ campo, para isso usei o cut -f6 e nada... Ele
mostra exatamente como era o arquivo.
Sei que deve ser possível resolver com print ou awk, mas agora queria
entender esse erro...
Att,
Wagner Brasileiro
Tiago Peczenyj tiago.peczenyj@gmail.com [shell-script]
2017-02-22 20:10:09 UTC
Permalink
Ola

Este erro é bem comum: supor uma dada configuração e na pratica não ser bem
assim.

No caso alem do espaço em branco e tab existem outros carácteres
"invisíveis" (ex carácteres de escape) que vão atrapalhar uma analise mais
simples. Ou quando stderr e stdin são capturados ao mesmo tempo e vc pode
ter algo inesperado no meio de uma linha (num arquivo grande pode passar
desapercebido)

Outro exemplo é quando o próprio nome de arquivo tem um espaço. Ou
carácteres acentuados em algum encoding tinhoso.

awk é mais esperto com relação a ler dados "tabulados". Seja paranoico e
verifique tudo: se o arquivo existe, se a linha está no formato que vc
espera, etc.

Às vezes não conseguimos analisar 100% do arquivo. Vale imprimir dizendo
"não entendi essa linha: ..."

O script ficará complexo. Mas se o que vc está fazendo pode trazer
prejuízos se mal feito então vale a pena (não faça como eu q apaguei
diretorios errados recursivamente ate o / )

Hoje sou pragmático ao shell: prefiro usar a linha de comando ou pequenos
(10-20 linhas) scripts. Mais que isso eu sei que terei problemas no longo
prazo, de alguma forma (portabilidade, etc)

Boa sorte
Post by Alfredo Casanova ***@gmail.com [shell-script]
faça um
$ cat -vet teste.out
assim vc poderá ver se o arquivo está, de fato, separado por TABS. Eu
acredito que, por ser uma saída de ls, não está.
Na saída do cat -vet o tab é representado por ^I
On Thu, Feb 16, 2017 at 7:26 PM Wagner Brasileiro
Boa tarde pessoal, sei que parece meio patética minha dúvida e estou meio
enferrujado em Bash, mas já revisei o histórico do grupo e pesquisei na
internet e todos são categóricos em afirmar que se quer fazer cut baseado
nos delimitadores TABs é só ocultar a opção "-d" pois o TAB é o delimitador
natural do Bash, porém não funciona como eu esperava... Já tentei direto
com a saída do comando ou enviando a saíta para um arquivo e depois a
enviando ao cut e ele simplesmente é indiferente, não visualizo onde estou
total 128
drwxr-xr-x 20 wagner wagner 4096 Fev 16 13:01 .
drwxr-xr-x 3 root root 4096 Fev 14 12:47 ..
drwxr-xr-x 2 wagner wagner 4096 Fev 14 12:51 Área de trabalho
-rw------- 1 wagner wagner 40 Fev 15 12:44 .bash_history
-rw-r--r-- 1 wagner wagner 220 Fev 14 12:47 .bash_logout
-rw-r--r-- 1 wagner wagner 3515 Fev 14 12:47 .bashrc
drwx------ 8 wagner wagner 4096 Fev 14 15:29 .cache
drwx------ 12 wagner wagner 4096 Fev 15 12:39 .config
drwx------ 3 wagner wagner 4096 Fev 14 12:51 .dbus
Minha idéia é pegar o 6⁰ campo, para isso usei o cut -f6 e nada... Ele
mostra exatamente como era o arquivo.
Sei que deve ser possível resolver com print ou awk, mas agora queria
entender esse erro...
Att,
Wagner Brasileiro
--
Tiago B. Peczenyj

http://about.me/peczenyj
Ivan lopes lopesivan.del@gmail.com [shell-script]
2017-02-23 18:51:07 UTC
Permalink
mude o separador para o caracter que vc escolher e assim tudo funciona ...
mesmo com arquivo com nomes em branco ...
Post by Tiago Peczenyj ***@gmail.com [shell-script]
Ola
Este erro é bem comum: supor uma dada configuração e na pratica não ser
bem assim.
No caso alem do espaço em branco e tab existem outros carácteres
"invisíveis" (ex carácteres de escape) que vão atrapalhar uma analise mais
simples. Ou quando stderr e stdin são capturados ao mesmo tempo e vc pode
ter algo inesperado no meio de uma linha (num arquivo grande pode passar
desapercebido)
Outro exemplo é quando o próprio nome de arquivo tem um espaço. Ou
carácteres acentuados em algum encoding tinhoso.
awk é mais esperto com relação a ler dados "tabulados". Seja paranoico e
verifique tudo: se o arquivo existe, se a linha está no formato que vc
espera, etc.
Às vezes não conseguimos analisar 100% do arquivo. Vale imprimir dizendo
"não entendi essa linha: ..."
O script ficará complexo. Mas se o que vc está fazendo pode trazer
prejuízos se mal feito então vale a pena (não faça como eu q apaguei
diretorios errados recursivamente ate o / )
Hoje sou pragmático ao shell: prefiro usar a linha de comando ou pequenos
(10-20 linhas) scripts. Mais que isso eu sei que terei problemas no longo
prazo, de alguma forma (portabilidade, etc)
Boa sorte
Post by Alfredo Casanova ***@gmail.com [shell-script]
faça um
$ cat -vet teste.out
assim vc poderá ver se o arquivo está, de fato, separado por TABS. Eu
acredito que, por ser uma saída de ls, não está.
Na saída do cat -vet o tab é representado por ^I
On Thu, Feb 16, 2017 at 7:26 PM Wagner Brasileiro
Boa tarde pessoal, sei que parece meio patética minha dúvida e estou meio
enferrujado em Bash, mas já revisei o histórico do grupo e pesquisei na
internet e todos são categóricos em afirmar que se quer fazer cut baseado
nos delimitadores TABs é só ocultar a opção "-d" pois o TAB é o delimitador
natural do Bash, porém não funciona como eu esperava... Já tentei direto
com a saída do comando ou enviando a saíta para um arquivo e depois a
enviando ao cut e ele simplesmente é indiferente, não visualizo onde estou
total 128
drwxr-xr-x 20 wagner wagner 4096 Fev 16 13:01 .
drwxr-xr-x 3 root root 4096 Fev 14 12:47 ..
drwxr-xr-x 2 wagner wagner 4096 Fev 14 12:51 Área de trabalho
-rw------- 1 wagner wagner 40 Fev 15 12:44 .bash_history
-rw-r--r-- 1 wagner wagner 220 Fev 14 12:47 .bash_logout
-rw-r--r-- 1 wagner wagner 3515 Fev 14 12:47 .bashrc
drwx------ 8 wagner wagner 4096 Fev 14 15:29 .cache
drwx------ 12 wagner wagner 4096 Fev 15 12:39 .config
drwx------ 3 wagner wagner 4096 Fev 14 12:51 .dbus
Minha idéia é pegar o 6⁰ campo, para isso usei o cut -f6 e nada... Ele
mostra exatamente como era o arquivo.
Sei que deve ser possível resolver com print ou awk, mas agora queria
entender esse erro...
Att,
Wagner Brasileiro
--
Tiago B. Peczenyj
http://about.me/peczenyj
Ivan lopes lopesivan.del@gmail.com [shell-script]
2017-02-23 19:21:17 UTC
Permalink
eu vou ser direto pois vc pode se complicar com o IFS e sem blah blah blah!

Roda essa linha e veja oq acontece ...
$ ls -l| sed -e 's/\s\+/@/5'

agora muda de 5 para 6
$ ls -l| sed -e 's/\s\+/@/6'

entendeu ???? vc pode selecionar onde ocirre a substituição por campo

se entendeu faça

$ ls -l| sed -e 's/\s\+/@/5' -e 's/\s\+/@/5'

OK ???? eh o sed aplicando duas substituições sequenciais primeiro uma e
depois a outra
stream>[cmd1]>[cmd2]>out
Post by Ivan lopes ***@gmail.com [shell-script]
mude o separador para o caracter que vc escolher e assim tudo funciona
... mesmo com arquivo com nomes em branco ...
Post by Tiago Peczenyj ***@gmail.com [shell-script]
Ola
Este erro é bem comum: supor uma dada configuração e na pratica não ser
bem assim.
No caso alem do espaço em branco e tab existem outros carácteres
"invisíveis" (ex carácteres de escape) que vão atrapalhar uma analise mais
simples. Ou quando stderr e stdin são capturados ao mesmo tempo e vc pode
ter algo inesperado no meio de uma linha (num arquivo grande pode passar
desapercebido)
Outro exemplo é quando o próprio nome de arquivo tem um espaço. Ou
carácteres acentuados em algum encoding tinhoso.
awk é mais esperto com relação a ler dados "tabulados". Seja paranoico e
verifique tudo: se o arquivo existe, se a linha está no formato que vc
espera, etc.
Às vezes não conseguimos analisar 100% do arquivo. Vale imprimir dizendo
"não entendi essa linha: ..."
O script ficará complexo. Mas se o que vc está fazendo pode trazer
prejuízos se mal feito então vale a pena (não faça como eu q apaguei
diretorios errados recursivamente ate o / )
Hoje sou pragmático ao shell: prefiro usar a linha de comando ou pequenos
(10-20 linhas) scripts. Mais que isso eu sei que terei problemas no longo
prazo, de alguma forma (portabilidade, etc)
Boa sorte
Post by Alfredo Casanova ***@gmail.com [shell-script]
faça um
$ cat -vet teste.out
assim vc poderá ver se o arquivo está, de fato, separado por TABS. Eu
acredito que, por ser uma saída de ls, não está.
Na saída do cat -vet o tab é representado por ^I
On Thu, Feb 16, 2017 at 7:26 PM Wagner Brasileiro
Boa tarde pessoal, sei que parece meio patética minha dúvida e estou
meio enferrujado em Bash, mas já revisei o histórico do grupo e pesquisei
na internet e todos são categóricos em afirmar que se quer fazer cut
baseado nos delimitadores TABs é só ocultar a opção "-d" pois o TAB é o
delimitador natural do Bash, porém não funciona como eu esperava... Já
tentei direto com a saída do comando ou enviando a saíta para um arquivo e
depois a enviando ao cut e ele simplesmente é indiferente, não visualizo
total 128
drwxr-xr-x 20 wagner wagner 4096 Fev 16 13:01 .
drwxr-xr-x 3 root root 4096 Fev 14 12:47 ..
drwxr-xr-x 2 wagner wagner 4096 Fev 14 12:51 Área de trabalho
-rw------- 1 wagner wagner 40 Fev 15 12:44 .bash_history
-rw-r--r-- 1 wagner wagner 220 Fev 14 12:47 .bash_logout
-rw-r--r-- 1 wagner wagner 3515 Fev 14 12:47 .bashrc
drwx------ 8 wagner wagner 4096 Fev 14 15:29 .cache
drwx------ 12 wagner wagner 4096 Fev 15 12:39 .config
drwx------ 3 wagner wagner 4096 Fev 14 12:51 .dbus
Minha idéia é pegar o 6⁰ campo, para isso usei o cut -f6 e nada... Ele
mostra exatamente como era o arquivo.
Sei que deve ser possível resolver com print ou awk, mas agora queria
entender esse erro...
Att,
Wagner Brasileiro
--
Tiago B. Peczenyj
http://about.me/peczenyj
Loading...