Esta é realmente apenas uma explicação da resposta de Yuzem , mas não achei que essa edição devesse ser feita para outra pessoa e os comentários não permitem a formatação, então ...
rdom (){local IFS=\> ; read -d \< E C ;}
Vamos chamar de "read_dom" em vez de "rdom", espaçá-lo um pouco e usar variáveis mais longas:
Ok, então define uma função chamada read_dom. A primeira linha torna o IFS (o separador de campos de entrada) local para essa função e o altera para>. Isso significa que, quando você lê dados, em vez de serem automaticamente divididos no espaço, tabulação ou novas linhas, eles são divididos em '>'. A próxima linha diz para ler a entrada de stdin e, em vez de parar em uma nova linha, pare quando vir um caractere '<' (o sinalizador -d para deliminador). O que é lido é então dividido usando o IFS e atribuído à variável ENTITY e CONTENT. Então, faça o seguinte:
<tag>value</tag>
A primeira chamada para read_domobter uma sequência vazia (já que o '<' é o primeiro caractere). Isso é dividido pelo IFS em apenas '', pois não há um caractere '>'. O Read então atribui uma string vazia às duas variáveis. A segunda chamada obtém a string 'tag> value'. Isso é dividido pelo IFS nos dois campos 'tag' e 'value'. O Read então atribui as variáveis como: ENTITY=tage CONTENT=value. A terceira chamada obtém a string '/ tag>'. Isso é dividido pelo IFS nos dois campos '/ tag' e ''. O Read então atribui as variáveis como: ENTITY=/tage CONTENT=. A quarta chamada retornará um status diferente de zero, porque chegamos ao final do arquivo.
Agora, o loop while se limpou um pouco para coincidir com o acima:
while read_dom;doif[[ $ENTITY ="title"]];then
echo $CONTENT
exitfidone< xhtmlfile.xhtml > titleOfXHTMLPage.txt
A primeira linha diz apenas "enquanto a função read_dom retorna um status zero, faça o seguinte." A segunda linha verifica se a entidade que acabamos de ver é "title". A próxima linha faz eco do conteúdo da tag. A linha quatro sai. Se não fosse a entidade do título, o loop será repetido na sexta linha. Nós redirecionamos "xhtmlfile.xhtml" para a entrada padrão (para a read_domfunção) e redirecionamos a saída padrão para "titleOfXHTMLPage.txt" (o eco do início do loop).
Agora, dê o seguinte (semelhante ao que você obtém ao listar um bucket no S3) para input.xml:
$ cat example.xml |./bash_xml.sh
bar type is: metal
foo size is:1789
EDIT 3 outro usuário disse que estava tendo problemas com ele no FreeBSD e sugeriu salvar o status de saída da leitura e devolvê-lo no final do read_dom como:
Se você tornar o IFS (o separador de campos de entrada) global, deve redefinir seu valor original no final, editei a resposta para obtê-lo. Caso contrário, qualquer outra entrada que você faça posteriormente no seu script será confusa. Eu suspeito que o motivo pelo qual o local não funcione para você é porque você está usando o bash em um modo de compatibilidade (como o seu shbang é #! / Bin / sh) ou é uma versão antiga do bash.
chad
30
Só porque você pode escrever seu próprio analisador, não significa que deveria.
Stephen Niedzielski
1
@chad certamente diz algo sobre AWS' fluxo de trabalho / implementação que eu estava procurando uma resposta para 'xml bash' também wget o conteúdo de um balde S3!
A atribuição do IFS em uma variável local é frágil e não é necessária. Basta fazer:, IFS=\< read ...que definirá apenas o IFS para a chamada de leitura. (Note que eu estou em nenhuma maneira endossando a prática do uso readde xml de análise, e eu acredito que isso é muito perigoso e deve ser evitado.)
William Pursell
64
Você pode fazer isso muito facilmente usando apenas o bash. Você só precisa adicionar esta função:
rdom (){local IFS=\> ; read -d \< E C ;}
Agora você pode usar o rdom como read, mas para documentos html. Quando chamado, rdom atribuirá o elemento à variável E e o conteúdo à var C.
Por exemplo, para fazer o que você queria:
while rdom;doif[[ $E = title ]];then
echo $C
exitfidone< xhtmlfile.xhtml > titleOfXHTMLPage.txt
você poderia elaborar isso? Eu aposto que é perfeitamente claro para você .. e isso poderia ser uma ótima resposta - se eu pudesse dizer o que você estava fazendo lá ... você pode dividir um pouco mais, possivelmente gerando alguma amostra de saída?
Alex Gray
1
Credite para o original - este verso é tão elegante e incrível.
Maverick
1
grande corte, mas eu tinha de usar as aspas como echo "$ C" para evitar a expansão shell e interpretação correta das linhas finais (depende do enconding)
user311174
8
A análise de XML com grep e awk não está bem . Pode ser um compromisso aceitável se os XMLs forem bastante simples e você não tiver muito tempo, mas nunca poderá ser considerada uma boa solução.
peterh - Restabelece Monica
59
As ferramentas de linha de comando que podem ser chamadas a partir de scripts de shell incluem:
4xpath - wrapper de linha de comando em torno do pacote 4Suite do Python
sim, uma segunda votação / solicitação - onde baixar essas ferramentas, ou você quer dizer que é necessário escrever manualmente um wrapper? Prefiro não perder tempo fazendo isso, a menos que seja necessário.
David
4
sudo apt-get install libxml-xpath-perl
Andrew Wagner
22
Você pode usar o utilitário xpath. Está instalado com o pacote Perl XML-XPath.
O uso de xml starlet é definitivamente uma opção melhor do que escrever o próprio serializador (como sugerido nas outras respostas).
Bruno von Paris
Em muitos sistemas, o xpathque vem pré-instalado não é adequado para uso como componente em scripts. Veja, por exemplo, stackoverflow.com/questions/15461737/… para uma elaboração.
a partir da resposta do chad, aqui está a solução de trabalho COMPLETA para analisar UML, com manipulação apropriada de comentários, com apenas duas pequenas funções (mais de 2 bu, você pode misturar todas). Não digo que o chad não funcionou, mas houve muitos problemas com arquivos XML mal formatados: então você precisa ser um pouco mais complicado para lidar com comentários e espaços extraviados / CR / TAB / etc.
O objetivo desta resposta é fornecer funções bash prontas para o uso, prontas para uso, para qualquer pessoa que precise analisar a UML sem ferramentas complexas usando perl, python ou qualquer outra coisa. Quanto a mim, não consigo instalar o cpan, nem os módulos perl para o antigo sistema operacional de produção em que estou trabalhando, e o python não está disponível.
Primeiro, uma definição das palavras UML usadas neste post:
ah, e você precisará de algumas variáveis dinâmicas de cores limpas para serem definidas primeiro e exportadas também:
set-a
TERM=xterm-256colorcase ${UNAME}in
AIX|SunOS)
M=$(${print}'\033[1;35m')
m=$(${print}'\033[0;35m')END=$(${print}'\033[0m');;*)
m=$(tput setaf 5)
M=$(tput setaf 13)# END=$(tput sgr0) # issue on Linux: it can produces ^[(B instead of ^[[0m, more likely when using screenrcEND=$(${print}'\033[0m');;esac# 24 shades of grey:for i in $(seq 023);doeval g$i="$(${print} \"\\033\[38\;5\;$((232 + i))m\")";done# another way of having an array of 5 shades of grey:
declare -a colorNums=(238240243248254)for num in01234;do nn[$num]=$(${print}"\033[38;5;${colorNums[$num]}m"); NN[$num]=$(${print}"\033[48;5;${colorNums[$num]}m");done# piped decolorization:
DECOLORIZE='eval sed "s,${END}\[[0-9;]*[m|K],,g"'
Como carregar tudo isso:
Você sabe como criar funções e carregá-las via FPATH (ksh) ou uma emulação de FPATH (bash)
Caso contrário, basta copiar / colar tudo na linha de comando.
Como funciona:
xml_read [-cdlp][-x command <-a attribute>]<file.xml>[tag |"any"][attributes ..|"content"]-c = NOCOLOR
-d =Debug-l = LIGHT (no \"attribute=\" printed)-p = FORCE PRINT (whenno attributes given)-x = apply a command on an attribute andprint the result instead of the former value,in green color
(no attribute given will load their values into your shell as $ATTRIBUTE=value;use'-p' to print them as well)
xml_read server.xml title content # print content between <title></title>
xml_read server.xml Connector port # print all port values from Connector tags
xml_read server.xml any port # print all port values from any tags
Com o modo Debug (-d), comentários e atributos analisados são impressos no stderr
Estou tentando usar as duas funções acima, que produz o seguinte ./read_xml.sh: line 22: (-1): substring expression < 0:?
precisa saber é o seguinte
Linha 22:[ "x${ATTRIBUTES:(-1):1}x" == "x?x" ] ...
khmarbaise
desculpe khmarbaise, estas são funções do shell bash. Se você quiser adaptá-los como scripts de shell, certamente precisará esperar algumas pequenas adaptações! Também as funções atualizados lidar com seus erros;)
limpador
4
Não conheço nenhuma ferramenta de análise XML de shell puro. Então você provavelmente precisará de uma ferramenta escrita em outro idioma.
Meu módulo XML :: Twig Perl vem com uma ferramenta: xml_greponde você provavelmente escreveria o que deseja xml_grep -t '/html/head/title' xhtmlfile.xhtml > titleOfXHTMLPage.txt(a -topção fornece o resultado como texto em vez de xml)
Após alguma pesquisa para tradução entre os formatos Linux e Windows dos caminhos dos arquivos XML, encontrei tutoriais e soluções interessantes sobre:
Embora existam alguns utilitários de console prontos que podem fazer o que você deseja, provavelmente levará menos tempo para escrever algumas linhas de código em uma linguagem de programação de uso geral, como o Python, na qual você pode estender e adaptar facilmente suas necessidades.
Aqui está um script python usado lxmlpara análise - ele pega o nome de um arquivo ou uma URL como o primeiro parâmetro, uma expressão XPath como o segundo parâmetro e imprime as strings / nós correspondentes à expressão especificada.
Exemplo 1
#!/usr/bin/env pythonimport sys
from lxml import etree
tree = etree.parse(sys.argv[1])
xpath_expression = sys.argv[2]# a hack allowing to access the# default namespace (if defined) via the 'p:' prefix # E.g. given a default namespaces such as 'xmlns="http://maven.apache.org/POM/4.0.0"'# an XPath of '//p:module' will return all the 'module' nodes
ns = tree.getroot().nsmap
if ns.keys()andNonein ns:
ns['p']= ns.pop(None)# end of hack for e in tree.xpath(xpath_expression, namespaces=ns):if isinstance(e, str):print(e)else:print(e.text and e.text.strip()or etree.tostring(e, pretty_print=True))
lxmlpode ser instalado com pip install lxml. No ubuntu você pode usar sudo apt install python-lxml.
Nota : Se o seu XML tiver um espaço para nome padrão sem prefixo (por exemplo xmlns=http://abc...), você deverá usar o pprefixo (fornecido pelo 'hack') em suas expressões, por exemplo, //p:modulepara obter os módulos de um pom.xmlarquivo. Caso o pprefixo já esteja mapeado em seu XML, será necessário modificar o script para usar outro prefixo.
Exemplo 2
Um script único que serve ao propósito restrito de extrair nomes de módulos de um arquivo apache maven. Observe como o nome do nó ( module) é prefixado com o espaço para nome padrão {http://maven.apache.org/POM/4.0.0}:
Isso é incrível quando você quer evitar a instalação de pacotes extras ou não tem acesso. Em uma máquina de compilação, posso justificar uma chamada ou pip installexcesso extra . Obrigado! apt-getyum
E. Moffat
0
O método de Yuzem pode ser aprimorado invertendo a ordem dos sinais <e >na rdomfunção e nas atribuições de variáveis, de modo que:
rdom (){local IFS=\> ; read -d \< E C ;}
torna-se:
rdom (){local IFS=\< ; read -d \> C E ;}
Se a análise não for feita assim, a última tag no arquivo XML nunca será alcançada. Isso pode ser problemático se você pretende gerar outro arquivo XML no final do whileloop.
Embora pareça que "nunca analise XML, JSON ... do bash sem uma ferramenta adequada" é um bom conselho, discordo. Se esse é um trabalho paralelo, é essencial procurar a ferramenta adequada e aprender ... O Awk pode fazê-lo em minutos. Meus programas precisam trabalhar com todos os tipos de dados mencionados acima e mais. Inferno, eu não quero testar 30 ferramentas para analisar 5-7-10 formatos diferentes que eu preciso se puder resolver o problema em questão de minutos. Eu não ligo para XML, JSON ou o que quer! Eu preciso de uma solução única para todos eles.
Como exemplo: meu programa SmartHome administra nossas casas. Ao fazê-lo, ele lê uma infinidade de dados em muitos formatos diferentes que não consigo controlar. Eu nunca uso ferramentas dedicadas e adequadas, pois não quero gastar mais do que minutos lendo os dados necessários. Com os ajustes FS e RS, essa solução awk funciona perfeitamente para qualquer formato de texto. Mas, pode não ser a resposta correta quando sua tarefa principal é trabalhar principalmente com cargas de dados nesse formato!
O problema de analisar XML do bash que eu enfrentei ontem. Aqui está como eu faço isso para qualquer formato de dados hierárquico. Como um bônus - eu atribuo dados diretamente às variáveis em um script bash.
Para facilitar a leitura, apresentarei a solução em etapas. A partir dos dados de teste do OP, criei um arquivo: test.xml
Analisando o referido XML no bash e extraindo os dados em 90 caracteres:
Eu não me importo como é chamado o formato. Eu busco apenas a solução mais simples. Nesse caso em particular, posso ver pelos dados que newline é o separador de registros (RS) e <> delimit fields (FS). No meu caso original, eu tinha uma indexação complicada de 6 valores em dois registros, relacionando-os, descobrindo quando os dados existem mais campos (registros) podem ou não existir. Foram necessárias 4 linhas de awk para resolver o problema perfeitamente. Então, adapte a idéia a cada necessidade antes de usá-la!
A segunda parte simplesmente parece que há uma sequência desejada em uma linha (RS) e, se houver, imprime os campos necessários (FS). O processo acima levou cerca de 30 segundos para copiar e adaptar do último comando que usei dessa maneira (quatro vezes mais). E é isso aí! Feito em 90 caracteres.
Mas sempre preciso inserir os dados ordenadamente em variáveis no meu script. Primeiro testei as construções da seguinte forma:
Em alguns casos, uso printf em vez de print. Quando vejo que tudo parece bem, simplesmente termino de atribuir valores a variáveis. Eu sei que muitos pensam que "eval" é "mau", não há necessidade de comentar :) Trick funciona perfeitamente em todas as minhas quatro redes há anos. Mas continue aprendendo se você não entende por que isso pode ser uma prática ruim! Incluindo atribuições de variáveis bash e amplo espaçamento, minha solução precisa de 120 caracteres para fazer tudo.
Respostas:
Esta é realmente apenas uma explicação da resposta de Yuzem , mas não achei que essa edição devesse ser feita para outra pessoa e os comentários não permitem a formatação, então ...
Vamos chamar de "read_dom" em vez de "rdom", espaçá-lo um pouco e usar variáveis mais longas:
Ok, então define uma função chamada read_dom. A primeira linha torna o IFS (o separador de campos de entrada) local para essa função e o altera para>. Isso significa que, quando você lê dados, em vez de serem automaticamente divididos no espaço, tabulação ou novas linhas, eles são divididos em '>'. A próxima linha diz para ler a entrada de stdin e, em vez de parar em uma nova linha, pare quando vir um caractere '<' (o sinalizador -d para deliminador). O que é lido é então dividido usando o IFS e atribuído à variável ENTITY e CONTENT. Então, faça o seguinte:
A primeira chamada para
read_dom
obter uma sequência vazia (já que o '<' é o primeiro caractere). Isso é dividido pelo IFS em apenas '', pois não há um caractere '>'. O Read então atribui uma string vazia às duas variáveis. A segunda chamada obtém a string 'tag> value'. Isso é dividido pelo IFS nos dois campos 'tag' e 'value'. O Read então atribui as variáveis como:ENTITY=tag
eCONTENT=value
. A terceira chamada obtém a string '/ tag>'. Isso é dividido pelo IFS nos dois campos '/ tag' e ''. O Read então atribui as variáveis como:ENTITY=/tag
eCONTENT=
. A quarta chamada retornará um status diferente de zero, porque chegamos ao final do arquivo.Agora, o loop while se limpou um pouco para coincidir com o acima:
A primeira linha diz apenas "enquanto a função read_dom retorna um status zero, faça o seguinte." A segunda linha verifica se a entidade que acabamos de ver é "title". A próxima linha faz eco do conteúdo da tag. A linha quatro sai. Se não fosse a entidade do título, o loop será repetido na sexta linha. Nós redirecionamos "xhtmlfile.xhtml" para a entrada padrão (para a
read_dom
função) e redirecionamos a saída padrão para "titleOfXHTMLPage.txt" (o eco do início do loop).Agora, dê o seguinte (semelhante ao que você obtém ao listar um bucket no S3) para
input.xml
:e o seguinte loop:
Voce deveria pegar:
Então, se escrevemos um
while
loop como o de Yuzem:Obteríamos uma lista de todos os arquivos no bucket S3.
EDIT Se, por algum motivo
local IFS=\>
, não funcionar para você e você configurá-lo globalmente, você deve redefini-lo no final da função, como:Caso contrário, qualquer linha dividida posteriormente no script será confusa.
EDIT 2 Para dividir os pares de nome / valor de atributo, você pode aumentar da seguinte
read_dom()
maneira:Em seguida, escreva sua função para analisar e obter os dados desejados assim:
Então, enquanto você
read_dom
liga paraparse_dom
:Depois, dê o seguinte exemplo de marcação:
Você deve obter esta saída:
EDIT 3 outro usuário disse que estava tendo problemas com ele no FreeBSD e sugeriu salvar o status de saída da leitura e devolvê-lo no final do read_dom como:
Não vejo nenhuma razão para que isso não funcione
fonte
IFS=\< read ...
que definirá apenas o IFS para a chamada de leitura. (Note que eu estou em nenhuma maneira endossando a prática do usoread
de xml de análise, e eu acredito que isso é muito perigoso e deve ser evitado.)Você pode fazer isso muito facilmente usando apenas o bash. Você só precisa adicionar esta função:
Agora você pode usar o rdom como read, mas para documentos html. Quando chamado, rdom atribuirá o elemento à variável E e o conteúdo à var C.
Por exemplo, para fazer o que você queria:
fonte
As ferramentas de linha de comando que podem ser chamadas a partir de scripts de shell incluem:
Também uso xmllint e xsltproc com pequenos scripts de transformação XSL para processar XML a partir da linha de comando ou em scripts de shell.
fonte
Você pode usar o utilitário xpath. Está instalado com o pacote Perl XML-XPath.
Uso:
ou XMLStarlet . Para instalá-lo no opensuse, use:
ou tente
cnf xml
em outras plataformas.fonte
xpath
que vem pré-instalado não é adequado para uso como componente em scripts. Veja, por exemplo, stackoverflow.com/questions/15461737/… para uma elaboração.apt-get install xmlstarlet
Isso é suficiente ...
fonte
apt-get install libxml-xpath-perl
.Confira o XML2 em http://www.ofb.net/~egnor/xml2/, que converte XML em um formato orientado a linhas.
fonte
a partir da resposta do chad, aqui está a solução de trabalho COMPLETA para analisar UML, com manipulação apropriada de comentários, com apenas duas pequenas funções (mais de 2 bu, você pode misturar todas). Não digo que o chad não funcionou, mas houve muitos problemas com arquivos XML mal formatados: então você precisa ser um pouco mais complicado para lidar com comentários e espaços extraviados / CR / TAB / etc.
O objetivo desta resposta é fornecer funções bash prontas para o uso, prontas para uso, para qualquer pessoa que precise analisar a UML sem ferramentas complexas usando perl, python ou qualquer outra coisa. Quanto a mim, não consigo instalar o cpan, nem os módulos perl para o antigo sistema operacional de produção em que estou trabalhando, e o python não está disponível.
Primeiro, uma definição das palavras UML usadas neste post:
EDIT: funções atualizadas, com alça de:
As funções, primeiro, são o xml_read_dom chamado recursivamente por xml_read:
e o segundo:
e, finalmente, as funções rtrim, trim e echo2 (to stderr):
Colorização:
ah, e você precisará de algumas variáveis dinâmicas de cores limpas para serem definidas primeiro e exportadas também:
Como carregar tudo isso:
Você sabe como criar funções e carregá-las via FPATH (ksh) ou uma emulação de FPATH (bash)
Caso contrário, basta copiar / colar tudo na linha de comando.
Como funciona:
Com o modo Debug (-d), comentários e atributos analisados são impressos no stderr
fonte
./read_xml.sh: line 22: (-1): substring expression < 0
:?[ "x${ATTRIBUTES:(-1):1}x" == "x?x" ] ...
Não conheço nenhuma ferramenta de análise XML de shell puro. Então você provavelmente precisará de uma ferramenta escrita em outro idioma.
Meu módulo XML :: Twig Perl vem com uma ferramenta:
xml_grep
onde você provavelmente escreveria o que desejaxml_grep -t '/html/head/title' xhtmlfile.xhtml > titleOfXHTMLPage.txt
(a-t
opção fornece o resultado como texto em vez de xml)fonte
Outra ferramenta de linha de comando é o meu novo Xidel . Ele também suporta XPath 2 e XQuery, ao contrário do xpath / xmlstarlet já mencionado.
O título pode ser lido como:
E também possui um recurso interessante para exportar várias variáveis para o bash. Por exemplo
define
$title
o título e$imgcount
o número de imagens no arquivo, que deve ser tão flexível quanto analisá-lo diretamente no bash.fonte
Bem, você pode usar o utilitário xpath. Eu acho que o XML :: Xpath do perl o contém.
fonte
Após alguma pesquisa para tradução entre os formatos Linux e Windows dos caminhos dos arquivos XML, encontrei tutoriais e soluções interessantes sobre:
fonte
Embora existam alguns utilitários de console prontos que podem fazer o que você deseja, provavelmente levará menos tempo para escrever algumas linhas de código em uma linguagem de programação de uso geral, como o Python, na qual você pode estender e adaptar facilmente suas necessidades.
Aqui está um script python usado
lxml
para análise - ele pega o nome de um arquivo ou uma URL como o primeiro parâmetro, uma expressão XPath como o segundo parâmetro e imprime as strings / nós correspondentes à expressão especificada.Exemplo 1
lxml
pode ser instalado compip install lxml
. No ubuntu você pode usarsudo apt install python-lxml
.Uso
lxml
também aceita um URL como entrada:Exemplo 2
Um script único que serve ao propósito restrito de extrair nomes de módulos de um arquivo apache maven. Observe como o nome do nó (
module
) é prefixado com o espaço para nome padrão{http://maven.apache.org/POM/4.0.0}
:pom.xml :
module_extractor.py :
fonte
pip install
excesso extra . Obrigado!apt-get
yum
O método de Yuzem pode ser aprimorado invertendo a ordem dos sinais
<
e>
nardom
função e nas atribuições de variáveis, de modo que:torna-se:
Se a análise não for feita assim, a última tag no arquivo XML nunca será alcançada. Isso pode ser problemático se você pretende gerar outro arquivo XML no final do
while
loop.fonte
Isso funciona se você estiver querendo atributos XML:
fonte
Embora pareça que "nunca analise XML, JSON ... do bash sem uma ferramenta adequada" é um bom conselho, discordo. Se esse é um trabalho paralelo, é essencial procurar a ferramenta adequada e aprender ... O Awk pode fazê-lo em minutos. Meus programas precisam trabalhar com todos os tipos de dados mencionados acima e mais. Inferno, eu não quero testar 30 ferramentas para analisar 5-7-10 formatos diferentes que eu preciso se puder resolver o problema em questão de minutos. Eu não ligo para XML, JSON ou o que quer! Eu preciso de uma solução única para todos eles.
Como exemplo: meu programa SmartHome administra nossas casas. Ao fazê-lo, ele lê uma infinidade de dados em muitos formatos diferentes que não consigo controlar. Eu nunca uso ferramentas dedicadas e adequadas, pois não quero gastar mais do que minutos lendo os dados necessários. Com os ajustes FS e RS, essa solução awk funciona perfeitamente para qualquer formato de texto. Mas, pode não ser a resposta correta quando sua tarefa principal é trabalhar principalmente com cargas de dados nesse formato!
O problema de analisar XML do bash que eu enfrentei ontem. Aqui está como eu faço isso para qualquer formato de dados hierárquico. Como um bônus - eu atribuo dados diretamente às variáveis em um script bash.
Para facilitar a leitura, apresentarei a solução em etapas. A partir dos dados de teste do OP, criei um arquivo: test.xml
Analisando o referido XML no bash e extraindo os dados em 90 caracteres:
Normalmente, uso uma versão mais legível, pois é mais fácil modificar na vida real, pois geralmente preciso testar de forma diferente:
Eu não me importo como é chamado o formato. Eu busco apenas a solução mais simples. Nesse caso em particular, posso ver pelos dados que newline é o separador de registros (RS) e <> delimit fields (FS). No meu caso original, eu tinha uma indexação complicada de 6 valores em dois registros, relacionando-os, descobrindo quando os dados existem mais campos (registros) podem ou não existir. Foram necessárias 4 linhas de awk para resolver o problema perfeitamente. Então, adapte a idéia a cada necessidade antes de usá-la!
A segunda parte simplesmente parece que há uma sequência desejada em uma linha (RS) e, se houver, imprime os campos necessários (FS). O processo acima levou cerca de 30 segundos para copiar e adaptar do último comando que usei dessa maneira (quatro vezes mais). E é isso aí! Feito em 90 caracteres.
Mas sempre preciso inserir os dados ordenadamente em variáveis no meu script. Primeiro testei as construções da seguinte forma:
Em alguns casos, uso printf em vez de print. Quando vejo que tudo parece bem, simplesmente termino de atribuir valores a variáveis. Eu sei que muitos pensam que "eval" é "mau", não há necessidade de comentar :) Trick funciona perfeitamente em todas as minhas quatro redes há anos. Mas continue aprendendo se você não entende por que isso pode ser uma prática ruim! Incluindo atribuições de variáveis bash e amplo espaçamento, minha solução precisa de 120 caracteres para fazer tudo.
fonte