Extrai comandos únicos únicos do histórico

3

Eu criei um arquivo chamado histcopy.txt com o histórico de comandos, (%código%). Parece um pouco assim:

 1. l
 2. ls
 3. cat necopy.txt
 4. netstat
 5. cd | ls-l ; grep -i "3" histcopy.txt | echo

E eu quero imprimir cada comando único, este é o comando que eu executei até agora:

awk '{print $2}' histcopy.txt | sort|uniq'

E o resultado disso é:

l
ls
cat
netstat
cd

Mas na última linha ( history > histcopy.txt ), há muitos comandos que ele ignora e recebe apenas o primeiro 5. cd | ls-l ; grep -i "3" histcopy.txt | echo . Como posso reescrever meu comando atual para que ele também seja extraído? Então, a partir da quinta linha, também extrairia:

  • cd
  • ls-l
  • grep -i "3: histcopy.txt

fazendo deles itens separados na lista de saída.

    
por kreqq_ 23.11.2016 / 13:46

2 respostas

2
$ cat histcopy.txt 
 1 l
 2 ls
 3 cat necopy.txt
 4 netstat
 5 cd | ls -l ; grep -i "3" histcopy.txt | echo

$ sed 's/^\s*\S*\s*//' histcopy.txt | tr ';|' '\n' | awk '!seen[$1]++{print $1}'
l
ls
cat
netstat
cd
grep
echo
  • sed 's/^\s*\S*\s*//' para remover o espaço inicial e o número associado ao comando em history output
  • tr ';|' '\n' replace ; e | com caracteres de nova linha. Isso funcionará para a declaração atual do problema, mas não ajudará se houver comandos dentro de substituições, etc.
  • awk '!seen[$1]++{print $1}' comandos exclusivos


Lógica semelhante implementada com perl sozinho

$ perl -lne 's/^\s*\S+//; (@a)= split/[;|]/; foreach (@a){($k) = /^\s*\K(\S+)/; print $k if !$seen{$k}++}' histcopy.txt 
l
ls
cat
netstat
cd
grep
echo
    
por 23.11.2016 / 15:11
0

Se você quiser ficar com awk :

awk 'BEGIN {RS="\n|\||;|\$\("}
     $1 ~ /^[0-9]+\./ {print $2; next}
     {print $1}' file | sort | uniq

Explicação : Diga ao awk que o seu separador de registro pode ser uma nova linha OU um "|", OU ";", OU "$ (", comandos canalizados, substituídos ou encadeados são divididos Em seguida, verifique se o seu primeiro campo é um número seguido por um ponto, se estiver, então você está no início de uma linha, então imprima o segundo campo, caso contrário, imprima o primeiro campo.

    
por 23.11.2016 / 14:59