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

jesse_b's questions

Martin Hope
jesse_b
Asked: 2023-12-19 22:04:06 +0800 CST

Converter tabela em json

  • 5

Tenho uma grande tabela de dados que gostaria de converter para json e não tenho certeza se uma ferramenta como jq, mlr ou similar seria capaz de executar tal tarefa sem ter que recorrer às minhas poucas habilidades em awk.

Tabela de amostra:

Balance_sheet for AAPL:

                                                        2023-09-30      2022-09-30      2021-09-30      2020-09-30
Treasury Shares Number                                         0.0             NaN             NaN             NaN
Ordinary Shares Number                               15550061000.0   15943425000.0   16426786000.0   16976763000.0

Saída preferida:

{
    "Balance_sheet for AAPL": {
        "Treasury Shares Number": {
            "2023-09-30": "0.0",
            "2022-09-30": "NaN",
            "2021-09-30": "NaN",
            "2020-09-30": "NaN"
        },
        "Ordinary Shares Number": {
            "2023-09-30": "15550061000.0",
            "2022-09-30": "15943425000.0",
            "2021-09-30": "16426786000.0",
            "2020-09-30": "16976763000.0"
        }
    }
}

O seguinte formato também funcionaria, mas menos desejado:

{
    "Balance_sheet for AAPL": {
        "2023-09-30": {
            "Treasury Shares Number": "0.0",
            "Ordinary Shares Number": "15550061000.0"
        },
        "2022-09-30": {
            "Treasury Shares Number": "NaN",
            "Ordinary Shares Number": "15943425000.0"
        },
        "2021-09-30": {
            "Treasury Shares Number": "NaN",
            "Ordinary Shares Number": "16426786000.0"
        },
        "2020-09-30": {
            "Treasury Shares Number": "NaN",
            "Ordinary Shares Number": "16976763000.0"
        }
    }
}

Alguém conhece um método lógico de fazer isso?

text-processing
  • 3 respostas
  • 127 Views
Martin Hope
jesse_b
Asked: 2023-10-10 21:47:05 +0800 CST

Adicionar/modificar chave/valor no objeto JSON

  • 6

Já fiz uma pergunta semelhante no passado, mas estou tendo dificuldade em adaptar essa solução a esse problema.

Eu tenho a seguinte matriz json:

$ jq <<<"$json"
[
  {
    "id": "node1"
  },
  {
    "id": "node2"
  },
  {
    "id": "node3"
  }
]

Quero adicionar uma chave/valor a cada nó ou modificá-lo se já existir. Eu posso fazer isso com:

$ jq '.[] | select(.id == "node2") += {status: "fail"}' <<<"$json"
{
  "id": "node1"
}
{
  "id": "node2",
  "status": "fail"
}
{
  "id": "node3"
}

Mas observe que a matriz externa desaparece, então quando tento implementar esta solução em meu script ela falha.

#!/usr/bin/env bash

[[ $DEBUG == true ]] && set -x

nodes=(node1 node2 node3)
json='[{"id": "node1"},{"id": "node2"},{"id": "node3"}]'

for node in "${nodes[@]}"; do
    if [[ $node == node2 ]]; then
        status=fail
    else
        status=pass
    fi
    json=$(jq --arg status "$status" --arg node "$node" '.[] | select(.id == $node) += {status: $status}' <<<"$json")
done

Erro:

$ ./script.sh
jq: error (at <stdin>:4): Cannot index string with string "id"
jq: error (at <stdin>:7): Cannot index string with string "id"
jq: error (at <stdin>:10): Cannot index string with string "id"

Existe uma maneira de modificar esses objetos JSON enquanto mantenho a estrutura geral?

bash
  • 1 respostas
  • 59 Views
Martin Hope
jesse_b
Asked: 2023-10-06 02:54:55 +0800 CST

STDIN quebra minha lista de seleção

  • 5

Eu tenho um script que pode, opcionalmente, receber alguma entrada no STDIN e posteriormente apresentar ao usuário algumas listas de seleção. Quando os dados são inseridos no STDIN, a lista de seleção é apresentada, mas sai sem receber entrada, porém funciona bem quando nada é fornecido via stdin.

Eu tenho um exemplo simples:

#!/usr/bin/env bash

if [[ -p /dev/stdin && ${#bar[@]} -eq 0 ]]; then
    while IFS= read -r foo; do
        bar+=("$foo")
    done </dev/stdin
fi

for foo in "${bar[@]}"; do
    echo "$foo"
done

select thing in foo bar baz; do
    case $thing in
        *)  echo "You have selected $thing"; break;;
    esac
done

Executando sem stdin:

$ ./script.sh
1) foo
2) bar
3) baz
#? 2
You have selected bar

Executando com stdin:

$ printf '%s\n' foo bar | ./script.sh
foo
bar
1) foo
2) bar
3) baz
#?
$

Alguém sabe por que isso acontece e como evitá-lo?

bash
  • 1 respostas
  • 32 Views
Martin Hope
jesse_b
Asked: 2022-06-03 09:55:32 +0800 CST

O que são aspas curly e posso usá-las no meu código?

  • 8

De alguma forma, aspas curvas entraram no meu código e estou tendo um comportamento inesperado

#!/bin/sh

if [ foo = ‘foo’ ]; then
   echo yes
else
   echo no
fi

Eu esperaria que isso ecoasse sim, mas em vez disso ecoa não.

shell-script quoting
  • 1 respostas
  • 1467 Views
Martin Hope
jesse_b
Asked: 2022-04-08 08:09:38 +0800 CST

Por que não consigo combinar ] com sed

  • 0

Estou tentando combinar um [ou ]em um conjunto de caracteres no sed, mas por algum motivo não gosta]

$ echo 'foo [bar]' | sed -E 's/[\[\]]//g'
foo [bar]

As seguintes obras:

$ echo 'foo [bar]' | sed -E 's/\]//g'
foo [bar
$ echo 'foo [bar]' | sed -E 's/[\[]//g'
foo bar]

Mas, por algum motivo, um ]interior desse conjunto de caracteres o quebra:

$ echo 'foo [bar]' | sed -E 's/[\]]//g'
foo [bar]

Estranhamente, até isso funciona:

$ echo 'foo [bar]' | sed -E 's/[]]//g'
foo [bar
$ echo 'foo [bar]' | sed -E 's/[[]//g'
foo bar]

Mas não isso:

$ echo 'foo [bar]' | sed -E 's/[[]]//g'
foo [bar]

Eu só preciso de algum tipo de escape extra ou isso é possível?

text-processing sed
  • 1 respostas
  • 144 Views
Martin Hope
jesse_b
Asked: 2020-02-26 13:39:16 +0800 CST

Soma valores em colunas csv

  • 1

Eu tenho vários arquivos csv bastante grandes que preciso somar os valores de cada coluna e transpor o cabeçalho da coluna.

CSV de amostra:

col1,col2,col3
enabled,disabled,active
disabled,disabled,enabled
N/A,enabled,active
enabled,N/A,disabled

Saída desejada:

col1,2 enabled,1 disabled,1 N/A
col2,1 enabled,2 disabled,1 N/A
col3,1 enabled,1 disabled,2 active

O csv real tem muito mais colunas e linhas, então seria preferível que ele pudesse iterar o arquivo automaticamente. Eu provavelmente poderia criar algum trabalho de hack de um programa awk para fazer uma coluna de cada vez, mas preferiria poder fazer o arquivo inteiro de uma só vez e não sei por onde começar com isso. A saída não precisa estar no formato exato que incluí, mas pelo menos semelhante.

awk text-processing
  • 2 respostas
  • 1150 Views
Martin Hope
jesse_b
Asked: 2020-01-26 07:03:56 +0800 CST

Como otimizar o GNU paralelo para este uso?

  • 2

Eu criei este script por tédio com o único propósito de usar/testar o GNU paralelo, então sei que não é particularmente útil ou otimizado, mas tenho um script que calculará todos os números primos até n:

#!/usr/bin/env bash

isprime () {
    local n=$1
    ((n==1)) && return 1
    for ((i=2;i<n;i++)); do
        if ((n%i==0)); then
            return 1
        fi
    done
    printf '%d\n' "$n"
}

for ((f=1;f<=$1;f++)); do
    isprime "$f"
done

Quando executado com o loop:

$ time ./script.sh 5000 >/dev/null

real    0m28.875s
user    0m38.818s
sys     0m29.628s

Eu esperaria que a substituição do loop for pelo GNU paralelo fizesse com que isso fosse executado significativamente mais rápido, mas essa não foi minha experiência. Em média, é apenas cerca de 1 segundo mais rápido:

#!/usr/bin/env bash

isprime () {
    local n=$1
    ((n==1)) && return 1
    for ((i=2;i<n;i++)); do
        if ((n%i==0)); then
            return 1
        fi
    done
    printf '%d\n' "$n"
}

export -f isprime

seq 1 $1 | parallel -j 20 -N 1 isprime {}

Executar com paralelo:

$ time ./script.sh 5000 >/dev/null

real    0m27.655s
user    0m38.145s
sys     0m28.774s

Eu não estou realmente interessado em otimizar a isprime()função, só estou querendo saber se há algo que eu possa fazer para otimizar o GNU paralelo?

No meu teste, seqna verdade, é mais rápido do que for ((i=1...)), então, não acho que tenha muito a ver com o tempo de execução


Curiosamente, se eu modificar o loop for para:

for ((f=1;f<=$1;f++)); do
    isprime "$f" &
done | sort -n

Ele roda ainda mais rápido:

$ time ./script.sh 5000 >/dev/null

real    0m5.995s
user    0m33.229s
sys     0m6.382s
bash parallelism
  • 3 respostas
  • 503 Views
Martin Hope
jesse_b
Asked: 2020-01-18 09:32:40 +0800 CST

Imprima a linha se a seguinte linha estiver faltando

  • 0

Isso está relacionado a awk print 2 lines back se corresponder, mas como meu comando tem problemas de buffer que não consigo resolver, acho que uma abordagem melhor seria ignorar completamente o stderr e procurar a saída com falta de certas linhas.

Então minha saída será:

Gathering drive descriptors ...
Gathering data for drive 0 ...
Drive Model: DataTraveler 2.0
Gathering data for drive 1 ...
Drive name:  id1,sd@n5000cca17096
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 2 ...
Drive name:  id1,sd@n5000cca24156
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 3 ...
Drive name:  id1,sd@n5000cca8749
Drive Model: HUH721010AL4204
Gathering data for drive 4 ...
Drive name:  id1,sd@n5000cca19183
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 5 ...
Drive name:  id1,sd@n5000cca4607
Drive Model: HUSMH8010BSS204
Gathering data for drive 6 ...
Drive name:  id1,sd@n5000cca10152
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

E eu gostaria de produzir o Drive namepara qualquer unidade que falte as linhas Drive Speede .Drive Temp

A saída deve ser:

Drive name:  id1,sd@n5000cca8749
Drive name:  id1,sd@n5000cca4607

Isso está além das minhas capacidades, mas tenho certeza de que awkposso fazer isso, mas não estou definido para usar awk, qualquer coisa que realize a tarefa funcionará (não possui ferramentas GNU). Obrigado!

awk text-processing
  • 4 respostas
  • 133 Views
Martin Hope
jesse_b
Asked: 2020-01-17 14:15:44 +0800 CST

awk imprime 2 linhas de volta se corresponder

  • 1

Eu tenho algumas saídas que se parecem com o seguinte:

Gathering data for drive 1 ...
Drive name:  id1,sd@n5000cca17096
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 2 ...
Drive name:  id1,sd@n5000cca24156
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 3 ...
Drive name:  id1,sd@n5000cca8749
Drive Model: HUH721010AL4204
failed to get drive stats

Gathering data for drive 4 ...
Drive name:  id1,sd@n5000cca19183
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 5 ...
Drive name:  id1,sd@n5000cca4607
Drive Model: HUSMH8010BSS204
failed to get drive stats

Gathering data for drive 6 ...
Drive name:  id1,sd@n5000cca10152
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Eu gostaria de imprimir o "Nome da unidade" para qualquer unidade na qual as estatísticas da unidade não possam ser retornadas (assim correspondendo em failed to get drive stats).

Eu sei como obter a linha anterior com:

awk '$0=="failed to get drive stats" && $2>1 {print f} {f=$0}'

Mas isso não me ajuda.

Saída desejada:

Drive name:  id1,sd@n5000cca8749
Drive name:  id1,sd@n5000cca4607

Editar:

Por algum motivo, quando a saída é redirecionada, ela não aparece da mesma maneira que no terminal. Se eu executar:

command >out.txt 2>&1

O arquivo de saída será semelhante a:

failed to get drive stats
failed to get drive stats

Gathering data for drive 1 ...
Drive name:  id1,sd@n5000cca17096
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

Gathering data for drive 2 ...
Drive name:  id1,sd@n5000cca24156
Drive Model: HUH721010AL4204
Drive Speed: 7200 RPMs
Drive Temp:  41 C

....

Ambas as respostas awk forneceram trabalho, mas acho que tenho outros problemas

awk text-processing
  • 3 respostas
  • 1057 Views
Martin Hope
jesse_b
Asked: 2020-01-17 12:50:17 +0800 CST

Por que a chamada system() do awk se comporta dessa maneira?

  • 5

Estou tentando realizar um grep dentro do awk usando system() que segundo o manual deve retornar o código de saída do comando que está sendo executado.

$ cat foo.txt
bar
$ grep -q bar foo.txt; echo $?
0
$ awk 'BEGIN{ if ( system( "grep -q bar foo.txt" ) ) { print "yes" } else { print "no" } }'
no

Se eu remover o -q, posso ver que o grep está realmente encontrando bar, portanto, deve sair 0 e, portanto, imprimir sim, não?

$ awk 'BEGIN{ if ( system( "grep bar foo.txt" ) ) { print "yes" } else { print "no" } }'
bar
no

Removendo completamente grepda equação:

$ awk 'BEGIN{ if ( system( "true" ) ) { print "yes" } else { print "no" } }'
no
awk gawk
  • 1 respostas
  • 806 Views
Martin Hope
jesse_b
Asked: 2019-10-27 11:52:49 +0800 CST

Como escapar da entrada JSON?

  • 7

Estou tentando criar uma ferramenta para enviar dados para um github gist por meio da API. O problema é que a API do github leva a essência contentcomo uma única linha com todas as sequências de escape escritas literalmente, assim:

{
  "test.txt": {
    "filename": "test.txt",
    "type": "text/plain",
    "language": "Shell",
    "raw_url": "https://gist.githubusercontent.com/jessebutryn/5c8b2a95b4b016e2fa33edee294c732b/raw/474f72ad32c843c18e9a61a228a31df6b85a8da1/test.txt",
    "size": 96,
    "truncated": false,
    "content": "#!/bin/sh\n\n# comment\nfunc () {\n\tfor ((i=1;i<10;i++)); do\n\t\t:\n\tdone\n}\n\nprintf '%s\\n' Foo bar baz\n"
  }
}

Esse conteúdo é exibido da seguinte forma:

#!/bin/sh

# comment
func () {
    for ((i=1;i<10;i++)); do
        :
    done
}

printf '%s\n' Foo bar baz

Que precisa ser convertido em:

#!/bin/sh\n\n# comment\nfunc () {\n\tfor ((i=1;i<10;i++)); do\n\t\t:\n\tdone\n}\n\nprintf '%s\\n' Foo bar baz\n

Existem ferramentas que fazem isso em uma ação? Se não, alguém sabe como isso poderia ser feito sedou com qualquer uma das ferramentas unix padrão?


Nota: Quaisquer sequências de escape literais no texto original precisarão ser escapadas para evitar que o github as interprete (no entanto, isso seria um problema secundário que não precisa necessariamente ser resolvido nesta questão, mas seria bom ter) :

ou seja:

printf '%s\n' Foo bar baz

torna-se:

printf '%s\\n' Foo bar baz
text-processing
  • 3 respostas
  • 8361 Views
Martin Hope
jesse_b
Asked: 2019-07-12 06:07:05 +0800 CST

Por que meu script cria um personagem extra?

  • 2

Eu sei que isso não é uma boa coisa a fazer e/ou uma boa solução, mas eu estava apenas brincando tentando responder a essa pergunta e me deparei com o seguinte problema.

O objetivo é ler o arquivo de entrada caractere por caractere e se o caractere estiver dentro do intervalo especificado, substitua-o.

Entrada:

NNNNN
NNNNN
NNNNN
NNNNN

Roteiro:

#!/bin/bash
#set -x

input=~/tmp/in
declare -i count=0
low=$1
high=$2
new_char=$3

while IFS=$'\n' read -r line; do
    while IFS= read -rn1 char; do
        if ((count>=low)) && ((count<=high)); then
            printf '%s' "$new_char"
        else
            printf '%s' "$char"
        fi
        ((count++))
    done <<<"$(printf '%s' "$line")"
    echo
done <"$input"

Saída desejada (quando executado como: ./script.sh 10 13 P):

NNNNN
NNNNP
PPPNN
NNNNN

Saída real:

$ ./script.sh 10 13 P
NNNNN
NNNNPP
PPNNN
NNNNN

Não sei por que aparentemente está criando um novo personagem do nada na 2ª linha e não substituindo o 13º personagem na 3ª linha. Eu tentei mover a ((count++))instrução para o início do segundo loop while, tentei iniciar em count=1, tentei aparentemente todas as combinações de ((++count))|| count=$((count+1))|| ((count+1)). Com resultados variados, mas todos parecem adicionar um caractere extra na segunda linha.

Verifiquei duas vezes se o arquivo de entrada não possui espaços em branco à direita em nenhuma das linhas.

bash text-processing
  • 2 respostas
  • 424 Views
Martin Hope
jesse_b
Asked: 2019-06-13 10:35:06 +0800 CST

Como posso detectar se estou em um subshell?

  • 33

Estou tentando escrever uma função para substituir a funcionalidade do exitbuiltin para me impedir de sair do terminal.

Eu tentei usar a SHLVLvariável de ambiente, mas ela não parece mudar nos subshells:

$ echo $SHLVL
1
$ ( echo $SHLVL )
1
$ bash -c 'echo $SHLVL'
2

Minha função é a seguinte:

exit () {
    if [[ $SHLVL -eq 1 ]]; then
        printf '%s\n' "Nice try!" >&2
    else
        command exit
    fi
}

Isso não me permitirá usar exitdentro de subshells:

$ exit
Nice try!
$ (exit)
Nice try!

Qual é um bom método para detectar se estou ou não em um subshell?

bash shell
  • 3 respostas
  • 7446 Views
Martin Hope
jesse_b
Asked: 2019-03-22 08:04:46 +0800 CST

Determinar DIMM ausente

  • 1

Quando um módulo de memória em um dos meus servidores falha, o log de eventos geralmente informa o slot DIMM errado ou um slot DIMM inexistente. A melhor maneira que encontramos para determinar o DIMM com falha é verificando qual está faltando.

Eu tenho um comando que produz a seguinte saída:

  Location Tag: P1-DIMMA1   Size: 34359738368 bytes
  Location Tag: P1-DIMMA2
  Location Tag: P1-DIMMB1   
  Location Tag: P1-DIMMC1
  Location Tag: P1-DIMMD1   Size: 34359738368 bytes
  Location Tag: P1-DIMMD2
  Location Tag: P1-DIMME1   Size: 34359738368 bytes
  Location Tag: P1-DIMMF1
  Location Tag: P2-DIMMA1   Size: 34359738368 bytes
  Location Tag: P2-DIMMA2
  Location Tag: P2-DIMMB1   Size: 34359738368 bytes
  Location Tag: P2-DIMMC1
  Location Tag: P2-DIMMD1   Size: 34359738368 bytes
  Location Tag: P2-DIMMD2
  Location Tag: P2-DIMME1   Size: 34359738368 bytes
  Location Tag: P2-DIMMF1

Neste exemplo, P1-DIMMB1 falhou (esse slot DIMM é preenchido em P2, mas não em P1)

Estou procurando um método programático para determinar quais slots DIMM estão vazios em uma CPU, mas não na outra. Eu criei a seguinte monstruosidade bash para fazer isso, mas tenho certeza de que há uma maneira mais simples de fazer isso com arquivos awk.


cpu1_dimms=()
cpu2_dimms=()
missing=()

while read -r line; do
    dimm=$(awk '{print $3}' <<<"$line")
    cpu=${dimm:1:1}
    size=$(awk '{print $5}' <<<"$line")
    if [[ -n "$size" ]]; then
        case $cpu in
            1)  cpu1_dimms+=( "${dimm:3}" );;
            2)  cpu2_dimms+=( "${dimm:3}" );;
        esac
    fi
done < <(echo "$var")

for dimm in "${cpu1_dimms[@]}"; do
    if ! [[ "${cpu2_dimms[@]}" =~ "$dimm" ]]; then
        missing+=( "P2-$dimm" )
    fi
done
for dimm in "${cpu2_dimms[@]}"; do
    if ! [[ "${cpu1_dimms[@]}" =~ "$dimm" ]]; then
        missing+=( "P1-$dimm" )
    fi
done

Isso pressupõe que a saída do comando acima mencionado seja armazenada na variávelvar

bash text-processing
  • 1 respostas
  • 210 Views
Martin Hope
jesse_b
Asked: 2019-02-09 12:17:32 +0800 CST

Adicionar à matriz apenas dentro do escopo da função

  • 3

Estou escrevendo uma função que fará chamadas de API REST que podem ser GET, PUT, DELETE, POST, etc.

Eu gostaria de alimentar esse método para a função como um parâmetro e adicioná-lo ao array de opções para essa única chamada de função. Isso é possível?

Atualmente estou resolvendo isso criando uma localmatriz separada, mas preferiria usar apenas a optionsmatriz única.

#!/bin/bash

options=(
    --user me:some-token
    -H "Accept: application/json"
)

some_func () {
    local urn=$1
    shift
    local func_opts=("${options[@]}" "$@")
    printf '%s\n' "${func_opts[@]}"
}

# This should return all options including -X GET
some_func /test -X GET

# This should return only the original options
printf '%s\n' "${options[@]}"

Eu também poderia usar um array temporário para armazenar o conteúdo de options, adicionar as novas opções e redefini-lo antes que a função termine, mas também não acho que seja um método particularmente limpo.

bash array
  • 2 respostas
  • 244 Views
Martin Hope
jesse_b
Asked: 2019-01-18 07:27:22 +0800 CST

Extraia várias linhas se corresponder

  • 5

Eu tenho um comando que gera informações sobre todos os slots DIMM em blocos como o seguinte:

ID    SIZE TYPE
44    105  SMB_TYPE_MEMDEVICE (type 17) (memory device)

  Manufacturer: NO DIMM
  Serial Number: NO DIMM
  Asset Tag: NO DIMM
  Location Tag: P1-DIMMD1
  Part Number: NO DIMM

  Physical Memory Array: 43
  Memory Error Data: Not Supported
  Total Width: 0 bits
  Data Width: 0 bits
  Size: Not Populated
  Form Factor: 9 (DIMM)
  Set: None
  Rank: Unknown
  Memory Type: 2 (unknown)
  Flags: 0x4
        SMB_MDF_UNKNOWN (unknown)
  Speed: Unknown
  Configured Speed: Unknown
  Device Locator: P1-DIMMD1
  Bank Locator: P0_Node1_Channel0_Dimm0
  Minimum Voltage: 1.20V
  Maximum Voltage: 1.20V
  Configured Voltage: 1.20V

Os blocos começam com o ID SIZE TYPEcabeçalho e terminam com as informações de tensão configuradas. O comando gera um desses blocos de dados para cada DIMM separados por uma única linha em branco cada.


Eu gostaria de obter o bloco de informações para um slot DIMM específico com base no Location Tagcampo, mas não tenho certeza de como fazer isso. Tenho certeza de que isso pode ser feito, awkmas só sei imprimir a correspondência awk '/P1-DIMMD1/'ou a linha antes da correspondênciaawk '/P1-DIMMD1/ {print a}{a=$0}'

Alguém sabe como eu poderia extrair todo esse bloco de dados se o Location Tagresultado da minha pesquisa ( P1-DIMMD1)?

awk text-processing
  • 3 respostas
  • 1932 Views
Martin Hope
jesse_b
Asked: 2018-07-29 13:19:19 +0800 CST

Por que o `.` foi escolhido para representar o comando ponto?

  • 8

Eu estou querendo saber depois de ver esta pergunta por que o .símbolo foi escolhido para representar o comando ponto ?

Não consigo encontrar muito sobre sua origem ou quem o criou e estou curioso para saber por que um ponto final foi escolhido para representar esse comando.

command history
  • 2 respostas
  • 477 Views
Martin Hope
jesse_b
Asked: 2018-06-29 09:16:06 +0800 CST

Imprimir correspondência e linha após

  • 6

Eu tenho alguns dados onde a 4ª coluna será frzou -. Eu gostaria de encontrar todas as linhas onde a 4ª coluna está frzapenas se a 4ª coluna da próxima linha estiver -e depois imprimir as duas linhas.

Exemplo de entrada:

2018-04-09T14:15:23.366Z  7 multi -   uuid1 uuid2 uuid3 -
2018-04-09T14:15:23.978Z  8 multi frz   uuid1 uuid3 -        -
2018-04-09T14:29:35.826Z  8 multi frz   uuid1 uuid3 uuid2 -
2018-04-09T17:19:01.901Z  8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z  8 multi -   uuid1 uuid3 uuid2 -
2018-06-28T00:35:54.338Z  9 multi -   uuid1 uuid2 -        -
2018-06-28T00:47:51.679Z  9 multi -   uuid1 uuid2 uuid3 -
2018-06-28T00:47:51.720Z 10 multi -   uuid1 uuid3 -        -
2018-06-28T00:47:58.863Z 10 multi -   uuid1 uuid3 uuid2 -
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -

Saída esperada:

2018-04-09T17:19:01.901Z  8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z  8 multi -   uuid1 uuid3 uuid2 -
2018-06-28T16:29:01.624Z 10 multi frz uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -

Encontrei alguns awkcomandos para imprimir a linha após uma correspondência, mas não consigo descobrir como combinar as duas linhas e imprimir ambas.

O que tenho atualmente:

$ awk 'f{print;f=0} $4=="frz"{f=1}' input
2018-04-09T14:29:35.826Z  8 multi frz   uuid1 uuid3 uuid2 -
2018-04-09T17:19:01.901Z  8 multi frz uuid1 uuid3 uuid2 -
2018-06-03T22:12:38.688Z  8 multi -   uuid1 uuid3 uuid2 -
2018-06-28T17:29:01.624Z 10 multi - uuid1 uuid3 uuid2 -
awk text-processing
  • 4 respostas
  • 1232 Views
Martin Hope
jesse_b
Asked: 2018-05-13 13:58:45 +0800 CST

Por que esse código funciona no bash v4.4, mas não no bash v3.2?

  • 2

Eu tenho o seguinte script bash:

#!/bin/bash

encl0=( 0,0 0,1 0,2 0,3 0,4 0,5 0,7 0,8 0,9 0,10 0,11 0,12 0,13 0,14 0,15 )
MISSING_DISKS=()
OLDIFS=$IFS
IFS=$'\n'
MISSING_DISKS+=($({ printf '0 %s\n' {0..15}; printf '0 %s\n' "${encl0[@]#0,}"; } | sort | uniq -u))
IFS=$OLDIFS
echo "$({ printf '0 %s\n' {0..15}; printf '0 %s\n' "${encl0[@]#0,}"; } | sort | uniq -u)"
echo "${MISSING_DISKS[@]}"
if ((${#MISSING_DISKS[@]}>1)); then
    echo "Greater than 1"
else
    echo "Success"
fi

Quando o executo com o bash v4.4, funciona como esperado:

$ /usr/local/bin/bash test.sh
0 6
0 6
Success

No entanto, quando eu o executo com o bash v3.2, ele não:

$ /bin/bash test.sh
0 6
0 0 0 0 1 2 3 4 5 7 8 9 10 11 12 13 14 15 0 1 0 10 0 11 0 12 0 13 0 14 0 15 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9
Greater than 1

Não entendo como MISSING_DISKSestá sendo definido para algo diferente da saída do comando que o está configurando. Alguém sabe o que está causando isso?

bash shell-script
  • 1 respostas
  • 271 Views
Martin Hope
jesse_b
Asked: 2018-05-11 13:38:46 +0800 CST

Maneira mais eficiente de encontrar o número perdido

  • 1

Eu tenho uma variável chamada DISK_INFOcom o seguinte conteúdo:

diskid   HGST     HUSMH8010BSS204  serial             no  no  [0] Slot00
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot02
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot03
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot04
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot05
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot06
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot07
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot08
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot09
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot10
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot11
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot12
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot13
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot14
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot15
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot16
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot17
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot18
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot19
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot20
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot21
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot22
diskid   HGST     HUH728080AL4204  serial             no  no  [0] Slot23
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot00
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot01
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot02
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot03
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot04
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot05
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot06
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot07
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot08
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot09
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot10
diskid   HGST     HUH728080AL4204  serial             no  no  [1] Slot11
c2t0d0                  Kingston DataTraveler 2.0 -                    -   -   -

Quando um disco falhar, ele será removido desta lista, neste exemplo, o disco no gabinete 0 Slot 01 falhou.

Supondo que o gabinete 0 sempre tenha 24 discos 00-23 e o gabinete 1 sempre tenha 12 discos 00-11, como posso determinar com eficiência e precisão o(s) disco(s) ausente(s)?

Atualmente, tenho o seguinte, mas tenho certeza de que isso pode ser feito em um único comando awk:

enclosure0=($(awk '$7 ~ "[0]"{print $8}' <<<"$DISK_INFO" | sort -n))
enclosure1=($(awk '$7 ~ "[1]"{print $8}' <<<"$DISK_INFO" | sort -n))
for n in {00..23}; do
  grep -q "$n" <<<"${enclosure0[@]}" || missing+=("Enclosure 0 - Slot$n")
done
for n in {00..11}; do
  grep -q "$n" <<< "${enclosure1[@]}" || missing+=("Enclosure 1 - Slot$n")
done
bash text-processing
  • 3 respostas
  • 847 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