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-245871

annahri's questions

Martin Hope
annahri
Asked: 2023-09-01 11:37:30 +0800 CST

Contagem de matriz de arquivo de mapa Bash diferente

  • 5

Eu fiz o seguinte:

mapfile -t array < <(commands)

onde commandsproduzirá saída separada por nova linha.

Então, com base no resultado, se não houver nada no array, saia, caso contrário continue:

[[ "${#array[@]}" -eq 0 ]] && exit

...

O problema é que a condição nunca é atendida. Porque quando o dito commandsnão retorna nada, ${#array[@]}retorna 1 em vez de 0.

Mas conta corretamente se eu atribuir o array da seguinte maneira:

array=($(commands))

Meus testes:

$ declare -a array
$ array=($(echo))
$ echo ${#array[@]}
0
$ unset array
$ mapfile -t array < <(echo)
$ echo ${#array[@]}
1

Por que?


Inicialmente usei o array=($(commands))formato, mas shellchecksugeri que mapfileo usasse.

GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
bash
  • 1 respostas
  • 37 Views
Martin Hope
annahri
Asked: 2022-10-09 18:39:26 +0800 CST

Pule a primeira linha em AWK enquanto configura RS no bloco BEGIN

  • -1

Tenho o seguinte arquivo de entrada:

-Queue ID-  --Size-- ----Arrival Time---- -Sender/Recipient-------
0F2F77F472  4343854 Fri Oct  7 10:13:41  [email protected]
(host redacted.host.com[x.x.x.x] said: 452 4.2.2 Over quota (in reply to end of DATA command))
                                         [email protected]

03A017F486   992790 Fri Oct  7 13:09:44  [email protected]
(host host.redacted.net[y.y.y.y] said: 452-4.2.2 The email account that you tried to reach is over quota. Please direct 452-4.2.2 the recipient to 452 4.2.2  redacted (in reply to RCPT TO command))
                                         [email protected]

No meu script AWK, escrevi algo assim:

BEGIN {
  RS = "\n\n"
}

{
  ... do something ...
}

O cabeçalho também seria processado, então no meu pipeline, antes de passar para o AWK, eu faço:

... | tail +2 | awk -f script

Reconheci que pular a primeira linha no AWK, principalmente, é fazer este truque simples:

{
  if (NR > 1) {
    ...
  }
}

Deveria funcionar, mas o RS = "\n\n"que eu configurei no BEGINbloco faria com que o primeiro registro fosse ignorado (o AWK interpreta o cabeçalho como parte do primeiro registro).

Testes:

$ awk 'BEGIN { RS = "\n\n" } { print NF }' sample
28
41

$ awk 'BEGIN { RS = "\n\n" } NR > 1 { print NF }' sample
41

Existe alguma maneira de atingir o objetivo sem depender de nenhuma ferramenta externa?


GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
awk
  • 1 respostas
  • 32 Views
Martin Hope
annahri
Asked: 2022-02-13 04:01:01 +0800 CST

Esta sintaxe sed não removerá linhas em branco

  • 0

Eu tenho este arquivo de entrada:

...
https://long-url/something?value1=999&something=xyz?value2=555
https://long-url/something?value1=534&something=xyz?value2=2312


https://long-url/something?value1=534&something=xyz?value2=233
https://long-url/something?value1=534
...

Eu quero capturar o valor1 e o valor2 e produzi-los como csv e descartar todas as linhas que não correspondem:

...
999,555
534,2312
534,233
...

Não tenho problemas em capturar os valores, mas estou tendo problemas para remover linhas indesejadas:

sed 's/.*categoryid=\([0-9]*\).*courseid=\([0-9]*\).*/\1,\2/g;/^[^0-9]\+/d' input-file

Basicamente, o /^[^0-9]\+/dnão está funcionando como pretendido. Eu estava pensando que removeria todas as linhas que não começassem com nenhum dígito, mas, em vez disso, me deu:

999,555
534,2312


534,233

Minha versão sed:sed (GNU sed) 4.7

sed
  • 3 respostas
  • 44 Views
Martin Hope
annahri
Asked: 2020-03-07 17:30:27 +0800 CST

Script executado por logrotate dá resultado diferente do que executando manualmente

  • 1

Eu quero girar nossos logs de aplicativos usando o logrotate. Após cada rotação, ele executa um script que move todos os logs girados para outro diretório. Por exemplo em /home/dev/logs/frontend, eu tenho esses arquivos de log:

webapp1-access.log
webapp2-access.log
anotherapp3-access.log
codename-access.log
...

E meu arquivo de configuração logrotate:

$ cat app.daily
/home/dev/logs/frontend/*access.log {
   rotate 1
   daily
   copytruncate
   compress
   notifempty
   missingok
   lastaction
      bash /path/to/script.sh
   endscript
}

E o que o script.sh faz é criar um diretório baseado no nome do arquivo de log e depois mover o arquivo de log girado para lá. O webapp1-access.logseria girado para webapp1-access.log.1.gzentão o script irá movê-lo para /x/y/webbapp1/renamed.log.gz. E assim por diante para outros logs girados.

Quando testei o logrotate usando logrotate -fv /path/to/config, e funcionou perfeitamente como eu esperava. Então eu coloco o arquivo de configuração logrotate para /etc/logrotate.d(como um link simbólico).

No dia seguinte, verifiquei o /x/ydir, recebi:

webbapp1/                       <---- created from initial logrotate -fv
webbapp1-access.log/            <---- Unexpected
anotherapp3/                    <---- created from initial logrotate -fv
anotherapp3-access.log/         <---- Unexpected
codename/                       <---- created from initial logrotate -fv
codename-access.log/            <---- Unexpected

Os *-access.log/dirs são criados pelo logrotate. Mas executar logrotate -vf configvárias vezes não produzirá esse resultado inesperado. Isso acontece quando deixo o logrotate fazer sua rotação diária.

Por que isso está acontecendo? Como posso consertar isso?


script.sh

#! /usr/bin/bash

exec 3>> /var/log/archived-log.log
[ "${1:-}" = "-d" ] && debug=1

environment="frontend"

rotateddir="/home/dev/logs/$environment"
destdir="/x/y"
[ "${debug:-}" ] && echo "DEST DIR: $destdir"

log() {
    timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    echo "$timestamp: $1" >&3
}

for archive in $rotateddir/*.gz; do
    [ "${debug:-}" ] && echo "ARCHIVE: $archive"
    [ "${archive##*/}" = "*.gz"  ] && continue
    base_name=$(basename "$archive")
    [ "${debug:-}" ] && echo "BASENAME: $base_name"
    extension="${base_name##*.}"
    [ "${debug:-}" ] && echo "EXT: $extension"
    newdir_name="${base_name%-*}"
    [ "${debug:-}" ] && echo "NEWDIR_NAME: $newdir_name"
    tanggal=$(stat -c %y "$archive" | cut -d" " -f1 | { read dat; date -d $dat +%Y%m%d; })
    #jam=$(stat -c %y "$archive" | cut -d" " -f2 | { read dat; date -d $dat +%H%M; })
    newdir_path="$destdir/$newdir_name"
    [ "${debug:-}" ] && echo "NEWDIR_PATH: $newdir_path"
    #dest_archive="$newdir_path/$tanggal-$jam.log.$extension"
    dest_archive="$newdir_path/$tanggal.log.$extension"
    [ "${debug:-}" ] && echo "DEST_ARCHIVE: $dest_archive"

    [ ! -d "$newdir_path" ] && {
        if [ "${debug:-}" ]; then
            echo "Would create $newdir_path"
        else
            mkdir -p "$newdir_path"
            log "Created directory: $newdir_path"
        fi
    }

    [ ! -f "$dest_archive" ] && {
        if [ "${debug:-}" ]; then
            echo "Would move $archive to $dest_archive"
        else
            rsync -a --no-owner --no-group --remove-source-files "$archive" "$dest_archive"
            #cp -u --no-preserve=mode,ownership "$archive" "$dest_archive" && rm -f "$archive"
            log "Relocated $archive to $dest_archive"
        fi
    }

    rotates=$(ls -1 "$newdir_path" | wc -l )
    [ "$rotates" -ge 7 ] && {
        oldest=$(ls -t "$newdir_path" | tail -1)
        if [ "${debug:-}" ]; then
            echo "Would delete the oldest archive: $oldest"
        else
            rm -f "$newdir_path/$oldest"
            log "Deleted oldest archive of $base_name : $oldest"
        fi
    }   
done

exit 0



Atualizar

Ainda não sei por que isso acontece, mas finalmente decidi executar o script pelo cron alguns minutos após a rotação.

Suspeito que esta parte do meu "script.sh" newdir_name="${base_name%-*}"não seja bem avaliada pelo logrotate. Mas, novamente, funcionou como esperado se eu o executasse com força usandologrotate -fv config

bash shell-script
  • 1 respostas
  • 171 Views
Martin Hope
annahri
Asked: 2020-02-21 02:08:01 +0800 CST

Como é que `... | awk '$1=$1'` remover espaços extras?

  • 20

Do meu entendimento, $1é o primeiro campo. Mas estranhamente, awk '$1=$1'omite espaços extras.

$ echo "$string"
foo    foo bar               bar

$ echo "$string" | awk '$1=$1'
foo foo bar bar

Por que isso está acontecendo?

awk
  • 2 respostas
  • 6532 Views
Martin Hope
annahri
Asked: 2020-02-10 23:08:51 +0800 CST

GNU coreutils `sort` se comporta de maneira diferente

  • 0

Eu queria classificar uma lista de dados e pretendia classificá-la com base em sua primeira coluna, que é um endereço IP.

192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.64
192.168.1.6
192.168.1.91

Na minha primeira máquina, testei sort -ne funcionou como eu esperava

# coreutils, version: 8.31, release: 23

192.168.1.6
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.64
192.168.1.91
192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119

Mas na minha segunda máquina, não vai classificar corretamente

# coreutils, version:8.4

192.168.1.100
192.168.1.101
192.168.1.110
192.168.1.119
192.168.1.20
192.168.1.30
192.168.1.33
192.168.1.54
192.168.1.6
192.168.1.64
192.168.1.91

Ambas as máquinas têm a mesma localidadeen_US.UTF-8


Por que isso está acontecendo? Como posso resolvê-lo?

linux shell
  • 1 respostas
  • 234 Views
Martin Hope
annahri
Asked: 2020-02-04 21:59:36 +0800 CST

Por que essa regex de antecipação positiva 'string.*?(?= )' não funciona no sed? [duplicado]

  • 5
Essa pergunta já tem respostas aqui :
Existem asserções de largura zero no sed? (1 resposta)
Por que minha expressão regular funciona em X, mas não em Y? (1 resposta)
Fechado há 2 anos .

Eu tenho uma longa lista de algo como:

AllowedUsers [email protected] [email protected] [email protected] [email protected] .....

tudo em linha única. Basicamente é um monte de username@ip

Eu queria encontrar e substituir apenas usando seu nome de usuário (por exemplo, aaa) e substituí-lo por nada.

Eu testei meu regex ( RegExr ) e funciona como eu esperava. Mas quando eu tento fazer isso sed, não funcionou.

$ sed 's/bbbb11.*?(?= )//' test
AllowedUsers [email protected] [email protected] [email protected] [email protected] .....

Eu também tentei usar bbbb11.*?(?=[[:space:]]), também não funcionou.

Perdi alguma coisa?

text-processing sed
  • 1 respostas
  • 4485 Views
Martin Hope
annahri
Asked: 2020-01-25 16:50:17 +0800 CST

Como ssh e executar vários comandos envolvidos se mais?

  • 2

Eu queria capturar alguns dados de vários servidores usando ssh e executar alguns comandos com algumas condições.

não quero fazer:

if ssh $host test -f /file; then
  # If file exists
  var=$(ssh $host long pipeline)
else
  # if it doesn't
  var=$(ssh $host another long pipeline)
fi

porque vai tornar o processo mais longo. Eu quero fazer o if else na máquina remota.


Eu tentei várias abordagens, mas não tive sorte.

var=$(ssh $host if [ -f /file ]\; then long pipeline1 \; else long pipeline2 \; fi)

Com base nesta resposta , funciona, mas o último comando do pipeline1 assume isso elsee o restante do pipeline2 como seus argumentos.

command: can't read else: No such file or directory
...
command: can't read fi: No such file or directory

Então eu tentei isso

var=$(ssh $host test -f /file \&\& pipeline1 \|\| pipeline2)

Novamente, o último comando de pipeline1 considerado ||como seu argumento.


Eu também tentei abaixo (com base nisso ), que está funcionando:

do_this () {
  if [ -f /file ]; then
    pipeline1
  else
    pipeline2
  fi
}
var=$(ssh $host "$(set); do_this")

No entanto, ele imprime mensagens de erro indesejadas que não afetam minha variável, mas é feio para o meu script.

bash: line 1: BASHOPTS: readonly variable
bash: line 8: BASH_VERSINFO: readonly variable
bash: line 24: EUID: readonly variable
bash: line 71: PPID: readonly variable
bash: line 82: SHELLOPTS: readonly variable
bash: line 92: UID: readonly variable

Alguma sugestão?


Atualizar

Acho que tenho que incluir o que é meu pipeline, basicamente é apenas um monte de processamento de texto:

cat file | grep "something" | sed 's/.*="\(.*\)"/\1/' | tr ' ' '-'

De acordo com a resposta de Jetchisel , em resumo, tive que envolver meus comandos com aspas simples.

var=$(ssh $host 'if [ -f /file ]; then cat file | grep "something" | sed 's/.*="\(.*\)"/\1/' | tr ' ' '-' ; else cat otherfile | ... ; fi'

eu consegui tr: invalid option -- ';'. trtratado ;como seu argumento.


Funciona usando heredoc:

var=$(ssh $host <<-EOF
  if [ -f file ]; then
    pipeline1
  else
    pipeline2
  fi
EOF
)

No entanto, quebrou a coloração do vim por causa da regex que uso no sed. Vou aceitar heredoccomo resposta por enquanto.


Atualização 2 : acredito que minha pergunta não seja uma duplicata de Multiple command in sshpass , meu caso é mais específico, enquanto o outro thread pergunta em geral.

bash shell-script
  • 2 respostas
  • 1395 Views
Martin Hope
annahri
Asked: 2019-07-22 14:54:14 +0800 CST

Como anexar ao final de cada linha?

  • 0

eu tenho esse arquivo,ipaddresses.txt

152.48.64.13
146.112.164.43
236.157.219.229
188.201.225.93
193.140.79.73
...

E este arquivo,cidr.txt

20
21
8
20
21
...

E eu quero que o arquivo de saída seja assim:

152.48.64.13/20
146.112.164.43/21
236.157.219.229/8
188.201.225.93/20
193.140.79.73/21
...

Como conseguir isso?

text-processing
  • 1 respostas
  • 337 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