AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-17307

Zombo's questions

Martin Hope
Zombo
Asked: 2018-11-25 06:41:05 +0800 CST

Comportamento de divisão inesperado

  • 1

Eu li sobre o comportamento de divisão do Awk aqui:

[...] o argumento fs para a função split (veja String Functions) deve ser interpretado como expressões regulares estendidas. Estes podem ser tokens ERE ou expressões arbitrárias e devem ser interpretados da mesma maneira que o lado direito do operador ~ou .!~

e:

Se o operando do lado direito for qualquer expressão diferente do token léxico ERE , o valor da string da expressão deve ser interpretado como uma expressão regular estendida, incluindo as convenções de escape descritas acima.

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_04

No entanto, notei um resultado inesperado, com este código:

BEGIN {
  print split("te.st", q, ".")
}

Eu esperaria que o .representasse qualquer personagem e que o resultado fosse 6. No entanto, todos os meus testes retornaram 2. A execução deste código fornece o esperado 6:

BEGIN {
  print split("te.st", q, /./)
}

Testado com:

  • bocejar
  • gawk --posix
  • 1.3.4
  • 1.3.3
  • nawk (original-awk)

Estou entendendo mal a documentação ou isso é um erro?

awk posix
  • 1 respostas
  • 314 Views
Martin Hope
Zombo
Asked: 2018-08-31 18:36:11 +0800 CST

Determinando se a primeira string começa com a segunda string

  • 5

JavaScript tem uma função para isso:

'world'.startsWith('w')
true

Como posso testar isso com shell? Eu tenho este código:

if [ world = w ]
then
  echo true
else
  echo false
fi

mas falha porque está testando a igualdade. Eu preferiria usar um built-in, mas qualquer utilitário desta página seria aceitável:

http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html

shell test
  • 2 respostas
  • 11881 Views
Martin Hope
Zombo
Asked: 2018-08-19 06:46:08 +0800 CST

Tamanho do buffer awk

  • 1

Eu notei este interessante conjunto de comandos hoje:

$ seq 5 > alfa.txt
$ awk '{print 6 > ARGV[1]} 1' alfa.txt
1
2
3
4
5

$ cat alfa.txt
6
6
6
6
6

Minha primeira pergunta foi por que estou recebendo vários 6em vez de apenas um, mas lembrei que você precisa fechar cada vez:

awk '{print 6 > ARGV[1]; close(ARGV[1])} 1' alfa.txt

No entanto, o que também me intriga é se estou sobrecarregando a entrada desde o início, como ainda posso ler o arquivo inteiro? Meu palpite é que o Awk está realmente gravando em um buffer e, em seguida, gravando no arquivo real no final ou talvez toda vez que o buffer for preenchido.

Se o último for verdadeiro, qual é o tamanho do buffer?

awk command-line
  • 2 respostas
  • 584 Views
Martin Hope
Zombo
Asked: 2018-07-06 15:52:11 +0800 CST

cURL url_effective com Hash

  • 2

Se você colocar este link em um navegador:

https://unix.stackexchange.com/q/453740#453743

ele retorna isso:

https://unix.stackexchange.com/questions/453740/installing-busybox-for-ubuntu#453743

No entanto, o cURL descarta o Hash:

$ curl -I https://unix.stackexchange.com/q/453740#453743
HTTP/2 302
cache-control: no-cache, no-store, must-revalidate
content-type: text/html; charset=utf-8
location: /questions/453740/installing-busybox-for-ubuntu

O cURL tem uma opção para manter o Hash com o URL resultante? Essencialmente, estou tentando escrever um script que resolva URLs como um navegador - é o que tenho até agora, mas é interrompido se o URL contiver um Hash:

$ set https://unix.stackexchange.com/q/453740#453743
$ curl -L -s -o /dev/null -w %{url_effective} "$1"
https://unix.stackexchange.com/questions/453740/installing-busybox-for-ubuntu
shell-script command-line
  • 2 respostas
  • 2664 Views
Martin Hope
Zombo
Asked: 2018-06-26 18:38:06 +0800 CST

Detectar argumento de função opcional (array)

  • 2

Considere esta função:

function add_one(in_ar,   each) {
  for (each in in_ar) {
    in_ar[each]++
  }
}

Eu gostaria de modificá-lo de forma que, se um segundo array for fornecido, ele seja usado em vez de modificar o array de entrada. Eu tentei isso:

function add_one(in_ar, out_ar,   each) {
  if (out_ar) {
    for (each in in_ar) {
      out_ar[each] = in_ar[each] + 1
    }
  }
  else {
    for (each in in_ar) {
      in_ar[each]++
    }
  }
}
BEGIN {
  split("1 2 3 4 5", q)
  add_one(q, z)
  print z[3]
}

mas recebo este resultado:

fatal: attempt to use scalar `z' as an array
awk array
  • 1 respostas
  • 223 Views
Martin Hope
Zombo
Asked: 2018-05-13 09:47:58 +0800 CST

Traço "-nt" comportamento

  • 2

O caso de uso em que posso pensar -ntseria atualizar um arquivo se for muito antigo ou se não existir. Bash lida com isso muito bem:

$ bash -c 'touch 2.txt; sleep 1; touch 1.txt; [ 1.txt -nt 2.txt ]; echo $?;
[ 1.txt -nt 3.txt ]; echo $?'
0
0

No entanto, o Dash só funciona conforme o esperado se ambos os arquivos existirem:

$ dash -c 'touch 2.txt; sleep 1; touch 1.txt; [ 1.txt -nt 2.txt ]; echo $?;
[ 1.txt -nt 3.txt ]; echo $?'
0
1

Estou tentando entender a lógica do código Dash. Você pode contornar esse comportamento assim:

$ dash -c 'touch 1.txt; [ ! -f 3.txt ] || [ 1.txt -nt 3.txt ]; echo $?'
0

mas por que isso seria necessário? Por que Dash escolheu essa lógica? Faz sentido ter a lógica Dash em certos casos?

shell timestamps
  • 1 respostas
  • 1053 Views
Martin Hope
Zombo
Asked: 2018-05-03 17:08:15 +0800 CST

Onde está "gcc_tooldir"

  • 3

Em Cross-Compiler-Specific Options , ele diz:

O valor padrão, caso --with-sysrootnão seja fornecido um argumento, é ${gcc_tooldir}/sys-root.

mas parece que gcc_tooldirnão está definido. Este é um apelido para outra coisa e também onde está "normalmente"?

compiling gcc
  • 1 respostas
  • 274 Views
Martin Hope
Zombo
Asked: 2018-04-02 12:59:34 +0800 CST

entrada padrão: não é um tty

  • 2

Às vezes, a entrada padrão (stdin) é um terminal:

$ tty
/dev/pts/0

Às vezes não:

$ echo hello | tty
not a tty

$ tty < /dev/null
not a tty

$ tty << eof
> hello
> eof
not a tty

Quando "stdin" não é um terminal, o que é? Esse grupo "not a tty" tem um nome coletivo ou todos são apenas referidos individualmente?

terminal pipe
  • 2 respostas
  • 6205 Views
Martin Hope
Zombo
Asked: 2018-04-01 06:22:47 +0800 CST

Awk detecta stdin

  • 0

Perl, Ruby e PHP podem detectar stdin:

$ perl -e 'print -t ? "no stdin" : "stdin"'
no stdin

$ echo | perl -e 'print -t ? "no stdin" : "stdin"'
stdin

$ ruby -e 'puts $stdin.isatty ? "no stdin" : "stdin"'
no stdin

$ echo | ruby -e 'puts $stdin.isatty ? "no stdin" : "stdin"'
stdin

$ php -r 'print posix_isatty(STDIN) ? "no stdin" : "stdin";'
no stdin

$ echo | php -r 'print posix_isatty(STDIN) ? "no stdin" : "stdin";'
stdin

O Awk tem alguma maneira de fazer isso? Eu tentei o ARGC, mas é o mesmo em ambos os casos:

$ awk 'BEGIN {print ARGC == 1 ? "no stdin" : "stdin"}'
no stdin

$ echo | awk 'BEGIN {print ARGC == 1 ? "no stdin" : "stdin"}'
no stdin
awk terminal
  • 2 respostas
  • 489 Views
Martin Hope
Zombo
Asked: 2018-03-31 15:10:05 +0800 CST

Realmente saia do script Awk

  • 5

Perl e Ruby exitrealmente saem:

$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1

$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1

Não é assim para Awk:

$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2

Eu tentei resolver isso com um "help.awk"

function really_exit() {
  IM_SURE = 1
  exit
}
END {
  if (IM_SURE) {
    exit
  }
}

mas isso cria seu próprio problema. Se "prog.awk" tiver apenas o bloco inicial:

BEGIN {
  print "start"
}

Em seguida, execute-o:

awk -f help.awk -f prog.awk

fará com que ele trave esperando pela entrada. Existe uma solução melhor disponível para realmente sair de um script Awk?

awk scripting
  • 1 respostas
  • 3904 Views
Martin Hope
Zombo
Asked: 2018-03-03 21:02:26 +0800 CST

Refil rígido de embalagem dura

  • 1

Dado este arquivo:

$ cat file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lima mike
november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

Eu gostaria de fazer um hard break em 70, mas também gostaria de fazer um hard refill. Tentei "dobrar", mas não recarregou:

$ fold -w 70 file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lim
a mike
november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

"fmt" será recarregado, mas eu só consegui quebrar nos espaços, então não há garantia de quebrar exatamente em 70:

$ fmt file
alfa bravo charlie delta echo foxtrot golf hotel india juliet
kilo lima mike november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

Eu tentei "pr", mas parece apenas truncar a linha sem quebrar:

$ pr -t -W 70 file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lim
november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

Talvez esses comandos tenham alguma opção que estou perdendo, ou talvez a solução Awk ou Sed. Prefiro evitar soluções mais pesadas (Perl PHP Ruby).

shell awk
  • 2 respostas
  • 70 Views
Martin Hope
Zombo
Asked: 2018-02-06 17:36:19 +0800 CST

Escapar aspas duplas na variável

  • 5

Eu gostaria de colocar este comando em um arquivo para ser executado posteriormente:

ln -s "$xr"/ya.txt ~

Eu posso fazer isso com (1):

cat > zu.sh <<eof
ln -s "$xr"/ya.txt ~
eof

ou (2):

printf 'ln -s "%s"/ya.txt ~\n' "$xr" > zu.sh

ou (3):

echo "ln -s '$xr'/ya.txt ~" > zu.sh

ou (4):

printf 'ln -s %q/ya.txt ~\n' "$xr" > zu.sh

ou (5):

printf 'ln -s "%s"/ya.txt ~\n' "${xr//\"/\\\"}"

no entanto, cada solução é problemática. se a variável em (1) ou (2) contiver aspas duplas, elas falharão; se a variável em (3) contiver uma aspa simples, ela falhará. (4) é bom, mas não é definido pelo POSIX . (5) é bom, mas é um bashismo . parece que a melhor opção seria usar (1) ou (2) e escapar de aspas duplas na variável, mas isso pode ser feito de outra maneira?

shell quoting
  • 1 respostas
  • 7920 Views
Martin Hope
Zombo
Asked: 2018-02-05 15:06:42 +0800 CST

Regressão com mais unário

  • 7

Anteriormente, as conversões numéricas podiam ser acionadas adicionando zero (+0), unário mais (+) ou unário menos (-):

$ gawk --version
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.6-p1, GNU MP 6.1.2)

$ gawk 'BEGIN {print "01" + 0}'
1

$ gawk 'BEGIN {print +"01"}'
1

$ gawk 'BEGIN {print -"01"}'
-1

No entanto, agora a conversão só acontece com a adição de zero e menos unário:

$ gawk --version
GNU Awk 4.2.0, API: 2.0 (GNU MPFR 3.1.6-p1, GNU MP 6.1.2)

$ gawk 'BEGIN {print "01" + 0}'
1

$ gawk 'BEGIN {print +"01"}'
01

$ gawk 'BEGIN {print -"01"}'
-1

Alguém sabe onde essa mudança foi mencionada ou por que foi feita?

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html

awk string
  • 1 respostas
  • 195 Views
Martin Hope
Zombo
Asked: 2018-02-04 11:04:19 +0800 CST

HISTTIMEFORMAT e excluindo entradas de histórico correspondentes

  • 0

Gostaria de excluir todas as entradas do histórico que correspondem a uma determinada string. Eu encontrei este método :

grep -v searchstring "$HISTFILE" > /tmp/history
mv /tmp/history "$HISTFILE"

mas não leva em consideração os comentários HISTTIMEFORMAT, por exemplo:

#1517681911
echo 1
#1517681918
echo 2
#1517681931
echo 3

Se eu quisesse remover "echo 2", o comentário anterior também precisaria ser removido. Como posso fazer isso?

bash shell
  • 1 respostas
  • 440 Views
Martin Hope
Zombo
Asked: 2018-01-21 05:46:37 +0800 CST

Terminal personalizado com menos

  • 2

Atualmente eu tenho isso no meu "~/.profile":

export PAGER='env TERM=fox less'

No entanto, acabei de perceber que isso só funciona com "man", e não se você fizer algo assim:

less /etc/DIR_COLORS

para tentar corrigir isso, criei um arquivo "~/.lesskey":

#env
LESS = -i
TERM = fox

e instalado executando "lesskey". Agora, quando executo "less", a variável "LESS" é reconhecida, mas não a variável "TERM". Como posso usar menos um terminal personalizado?

environment-variables terminal
  • 1 respostas
  • 103 Views
Martin Hope
Zombo
Asked: 2018-01-15 12:05:42 +0800 CST

Dividir caracteres individuais usando a string nula

  • 3

Eu li isso no manual do Gawk:

EXTENSÕES GNU

[...]

A capacidade de dividir caracteres individuais usando a string nula como o valor de FS e como o terceiro argumento para split().

No entanto, este parece não ser o caso. Isso funciona como esperado:

$ gawk 'BEGIN {print split("quebec", z, "")}'
6

e posso desabilitar outras extensões:

$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined

mas não consigo desativar o comportamento de divisão:

$ export POSIXLY_CORRECT
$ gawk 'BEGIN {print split("quebec", z, "")}'
6

$ gawk --posix 'BEGIN {print split("quebec", z, "")}'
6

Também procurei no manual do Mawk:

Se FS = "", então mawk divide o registro em caracteres individuais e, da mesma forma, split(s,A,"") coloca os caracteres individuais de s em A.

[...]

Posix deixa explicitamente o comportamento de FS = "" indefinido e menciona a divisão do registro em caracteres como uma possível interpretação, mas atualmente esse uso não é portátil entre as implementações.

Então, com quais implementações você não pode obter caracteres únicos com FSe split?

awk posix
  • 1 respostas
  • 1134 Views
Martin Hope
Zombo
Asked: 2017-12-24 10:50:29 +0800 CST

Carimbo de data/hora com resultado da pesquisa

  • 0

Eu sei que posso pesquisar o histórico com CtrlR. Também posso ver timestamps como este:

HISTTIMEFORMAT='%x %r '

em seguida, executando o comando "história". No entanto, gostaria de combinar os dois. Eu gostaria de pesquisar usando um destes ou similar:

  • CtrlR
  • history
  • fc
  • grep
  • less

mas o(s) resultado(s) deve(m) ter o timestamp pré-anexado. É possível uma coisa dessas?

bash shell
  • 1 respostas
  • 71 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve