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

Brad Parks's questions

Martin Hope
Brad Parks
Asked: 2023-03-04 00:18:42 +0800 CST

Mecanismo de modelo simples para bash, que pode usar dados csv?

  • 7

Muitas vezes, gostaria de pegar alguns dados rapidamente e aplicá-los a um modelo no bash.

por exemplo, imagine fazer o seguinte

  $ seq 1 2 | eztemplate 'this is a {1} test'
  this is a 1 test
  this is a 2 test

  $ eztemplate 'this is a {1} test' hi 'there now'
  this is a hi test
  this is a there now test

  $ eztemplate /tmp/template /tmp/alphabet  | head
  this is a a test
  of this system a
  this is a b test
  of this system b
  ...

Escrevi um script bash muito simples que faz isso, mas estava pensando em permitir vários parâmetros, como dados de estilo CSV, por linha de dados.

Já existe algo melhor do que meu pequeno script, dado o seguinte?

  • Eu quero que ele exija apenas ferramentas unix posix básicas e coisas comumente instaladas como perl ou awk, mas não requer que nenhum módulo seja instalado adicionalmente por perl, por exemplo
  • Ele pode aceitar várias colunas de dados, por linha de dados no arquivo de dados.
  • Basicamente é um script bash que não requer a instalação de mais nada: D
  • Uma intenção secundária é permitir que outros que não são bons em scripts bash tenham uma ferramenta simples para processar modelos para dados repetidos

Os dados e o modelo variam muito, mas o primeiro exemplo com o qual eu queria fazer era aplicar 4 ids a uma carga JSON

modelo

{
  "tenantId": "{1}",
  "key": "some.key",
  "value": "some.value"
}

dados

my/super/01cbf4e9779649038f0bd753747c8b26
my/test/01cbf4e9779649038f0bd753747c8b26
ez/test/01cbf4e9779649038f0bd753747c8b26
rad/data/df3a47fed39d453f836f9b2196332029

eztemplate

#!/usr/bin/env bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"; PATH="$DIR:$PATH"

function show_help()
{
  ME=$(basename "$0")
  IT=$(cat <<EOF

  replaces vars in a template, one for each line of stdin

  e.g.

  $ seq 1 2 | $ME 'this is a {1} test'
  this is a 1 test
  this is a 2 test

  $ $ME 'this is a {1} test' hi 'there now'
  this is a hi test
  this is a there now test

  $ $ME /tmp/template /tmp/alphabet
  this is a a test
  of this system a
  this is a b test
  of this system b
  ...

EOF
)
  echo "$IT"
  echo
  exit
}

if [ -z "$1" ]
then
  show_help
fi
if [ "$1" = "help" ] || [ "$1" = '?' ] || [ "$1" = "--help" ] || [ "$1" = "h" ]; then
  show_help
fi

function process_template(){
  DATA=$1
  VAR=$2

  if [ -f "$DATA" ]; then
    DATA=$(cat "$DATA")
  fi

  echo "$DATA" | sed "s#{1}#$VAR#g"
}


TEMPLATE=$1
if [ -t 0 ]
then
  if [ -f "$2" ]; then
    # allow first 2 parameters to be files, TEMPLATE and then DATA
    DATA_FILE=$2
    cat "$DATA_FILE" | while read line
    do
      process_template "$TEMPLATE" "$line"
    done 
  else
    shift;
    for line in "$@" 
    do
      process_template "$TEMPLATE" "$line"
    done
  fi
else
  # loop over lines from stdin
  while IFS= read -r line; do
    process_template "$TEMPLATE" "$line"
  done
fi
bash
  • 1 respostas
  • 68 Views
Martin Hope
Brad Parks
Asked: 2021-10-30 11:55:05 +0800 CST

bash: atribua a variável usando um subshell, mas saia do script principal se a atribuição falhar

  • 0

Eu gostaria de ter um script bash que me permitisse chamar uma função para ver se alguns dados estão contidos em um arquivo e, se não falhar, o script principal, como o seguinte, que é simplificado para manter isso no ponto.

Isso não funciona (não sai do script principal quando o sub shell falha).

Como posso escrever a require_linefunção para que eu pudesse dizer mais de 20 deles em um arquivo como esse

VALUE1=$(require_line "myKey1")
VALUE2=$(require_line "myKey2")
...

e não exigir um se em torno de cada um?

#!/bin/bash
set -eo pipefail

VALUE=$(require_line "myKey")

require_line(){
  local KEY=$1
  local DATA=$(cat /tmp/myfile)
  local INFO=$(echo "$DATA" | grep "$KEY")

  if [ ! -z "$INFO" ]
  then
    echo "Key not found in $DATA, key: $KEY"
    exit 1;
  fi
  echo "$INFO"
}
bash subshell
  • 2 respostas
  • 284 Views
Martin Hope
Brad Parks
Asked: 2021-10-01 06:27:59 +0800 CST

Fornecendo um script para alterar o pwd, ignorar a tubulação no final do comando?

  • 1

Eu tenho um pequeno script que escrevi que me permite mudar para o diretório de um script que está no caminho, o que me ajuda a acessar rapidamente outros scripts que costumo querer editar, na mesma pasta do script original.

Eu costumo fazer isso voltando na história e prefixando esse comando, não importa o que fosse, assim

$ . cdbin my_super_script

Isso funciona na maioria das vezes - mas - não funciona quando o último comando que eu estava executando estava sendo canalizado para algum lugar,

por exemplo

# if my last command was the following
$ my_super_script | grep -v bad | grep good

# then when I try and run my cdbin script using history, it looks like this
$ . cdbin my_super_script | grep -v bad | grep good

e isso simplesmente não faz nada - sem erros, apenas me deixa no meu diretório atual.

Aqui está meu cdbinscript simples:

cdbin

PROG=$(which "$1")
DIR=$(dirname "$PROG")
cd "$DIR" 

EDIT: Observe que estou ciente de que poderia simplesmente digitar algo como o seguinte na maioria das vezes para evitar isso, por exemplo, $ . cdbin !:0mas acho um toque estranho digitar: D

pipe cd-command
  • 1 respostas
  • 41 Views
Martin Hope
Brad Parks
Asked: 2019-10-26 04:15:41 +0800 CST

Como escrever scripts que criam vários painéis de terminal, como o tmux?

  • 4

Eu gostaria de escrever alguns scripts que abririam vários painéis de terminal em uma única janela, como tmuxou screen.

Pessoalmente, sou bem versado em tmux, e o uso há anos, mas outros desenvolvedores em nossa equipe não querem saber nada sobre ele ou outros multiplexadores de tela.

Para esse fim, gostaria de escrever scripts que possam se dividir em vários painéis em uma única janela. Isso é possível com bash direto?

Meus objetivos são

  • evite exigir nodeou algo que precise ser instalado, (como bendito-contrib ), para manter o processo o mais simples possível.
  • escreva-o usando algo pré-instalado na maioria das distros e compatível com posix.
  • tem uma única janela de terminal que é dividida em painéis, onde cada painel pode ser um processo em execução ou um prompt de comando.
  • quando alguém o atinge ctrl+c, sai de todos os painéis e retorna a um único terminal.
bash
  • 1 respostas
  • 880 Views
Martin Hope
Brad Parks
Asked: 2019-02-02 05:39:50 +0800 CST

Bash - Extrair o valor da chave pelo nome de um texto arbitrário?

  • 0

Eu gostaria de ter um script simples que me permitisse passar qualquer texto e extraísse um valor para uma chave da string.

Eu gostaria que isso fosse flexível e aceitasse entrada XML ou JSON e até mesmo entradas mal formadas, como texto de um log.

por exemplo, dada qualquer uma das seguintes entradas, deve ser capaz de extrair o valor da testchave.

por exemplo

$ echo "test:5 hi there" | extract_key_value test

deve resultar em

5

Observe que eu não me importo com o que está escrito, então node, ruby, etc está bem para mim, mas a portabilidade (Linux/osx) é boa ;-)

entrada1

this is test:5 i saw a value

entrada2

this is test:'another value' i saw a value

entrada3

this is test=5 i saw a value

entrada 4

test='a string value here'

entrada 5

my data
on line 2 test='a string value here'
more data

Minha dica rápida para isso é o seguinte, que acho que pode ser muito melhorado e parece que deve ser resolvido em algum lugar!

extract_key_value

#!/usr/bin/env bash

function show_help()
{
  IT=$(cat <<EOF
  
  Helps you extract a key value from a string, typically a log msg

  usage: key {keyBeginDelim} {keyEndDelim}

  e.g. given "asd f asdf asdf test=easy asdf me=you" as input

  extract_key_value test        
  => returns easy
EOF
)
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$1" ]
then
  show_help
fi

INPUT=$(cat -)
KEY="$1"

function getVal()
{
  DELIM1="$1"
  DELIM2="$2"
  echo "$INPUT" | awk -F "$DELIM1" '{print $2}' | awk -F "$DELIM2" '{print $1}'
}

# Try whatever the user passed in or defaults for delims
if [ -n "$2" ]
then
  IT=$(getVal "$2" "$3")
fi

# Try other use cases
if [ -z "$IT" ]
then
  IT=$(getVal "$KEY:'" "'")
fi
if [ -z "$IT" ]
then
  IT=$(getVal "$KEY='" "'")
fi
if [ -z "$IT" ]
then
  IT=$(getVal "$KEY=\"" "\"")
fi
if [ -z "$IT" ]
then
  IT=$(getVal "$KEY:\"" "\"")
fi
if [ -z "$IT" ]
then
  IT=$(getVal "$KEY:" " ")
fi
if [ -z "$IT" ]
then
  IT=$(getVal "$KEY=" " ")
fi
if [ -z "$IT" ]
then
  IT=$(getVal "$KEY=" ";")
fi
if [ -z "$IT" ]
then
  IT=$(getVal "$KEY:" ";")
fi

echo "$IT"
bash
  • 2 respostas
  • 546 Views
Martin Hope
Brad Parks
Asked: 2018-04-14 07:10:05 +0800 CST

Como esperar que o programa termine e canalizar stdin para stdout quando terminar?

  • 6

Estou tentando descobrir como esperar a conclusão de um comando e, em seguida, canalizar stdin para stdout. Estou em um mac, mas acho que minha pergunta é mais sobre como esperar a conclusão de um processo e canalizar a saída do que qualquer coisa a ver com um mac.

Percebi que no mac consigo rodar alguns saycomandos juntos, e eles esperam que cada frase seja totalmente falada antes de iniciar a próxima, se eu usar o &&operador para juntá-los.

$ say "stage 1" && say "stage 2"

Aqui é onde está o caso de uso real - eu tenho um script bash que gostaria que apenas passasse stdin para stdout, depois que terminasse de dizer algo.

$ cat /etc/passwd | say_and_pass "stage 1" | grep -v test | say_and_pass "stage 2"

Então, conceitualmente, isso diria em voz alta, "estágio 1", imediatamente diria "estágio 2" e, em seguida, despejaria o conteúdo grep de /etc/passwordpara stdout.

Minha rachadura inicial no say_and_passscript é esta:

diga_e_passe

#!/usr/bin/env bash
OUT="$*"
say "$OUT" && cat 

Mas não parece funcionar ;-)

EDIT: alterei o exemplo acima para usar say_and_pass "stage2"como comando final, que é necessário para que minha solução funcione...

bash
  • 6 respostas
  • 10760 Views
Martin Hope
Brad Parks
Asked: 2018-03-24 05:35:14 +0800 CST

Bash: Maneira sucinta de percorrer linhas de argumentos stdin ou de linha de comando?

  • 10

Eu tenho um script bash que gostaria de fazer um loop nas linhas em stdin ou em cada argumento passado.

Existe uma maneira limpa de escrever isso para que eu não precise ter 2 loops?

#!/bin/bash

# if we have command line args... 
if [ -t 0 ]
then
  # loop over arguments
  for arg in "$@" 
  do
    # process each argument
  done
else
  # loop over lines from stdin
  while IFS= read -r line; do
    # process each line
  done
fi

EDIT: Estou procurando uma solução genérica que use apenas um único loop, pois acho que quero fazer isso com bastante frequência, mas sempre escrevi 2 loops e, em vez disso, chamei uma função. Então, talvez algo que transforme stdin em uma matriz, para que eu possa usar um único loop?

bash
  • 3 respostas
  • 8637 Views
Martin Hope
Brad Parks
Asked: 2018-02-01 09:10:25 +0800 CST

Forçar TLS 1.2 em todo o sistema para todos os aplicativos?

  • 2

A organização para a qual trabalho tem muitos servidores que rodam Linux.

Recentemente, fomos encarregados de garantir que o TLS 1.2 seja usado para todas as conexões de saída para todos os nossos aplicativos, independentemente da plataforma de desenvolvimento em que nossos aplicativos são escritos, o que varia bastante (Ruby/Node/Java/PHP)

Existe uma maneira no nível do sistema de forçar tudo a usar o TLS 1.2?

linux security
  • 2 respostas
  • 3561 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