portanto vimdiff é uma ferramenta de comparação de arquivos voltada para o ambiente cli. Estou pensando se ela oferece funcionalidade para trocar linhas de códigos entre duas abas?
Sollosa's questions
Quero gerar algum texto com tabulação como separador usando ansible
aqui está o trecho da tarefa
- name: Create output file
blockinfile:
block: |
Some text\tmore text
path: '{{ playbook_dir }}/output.txt'
create: true
SAÍDA ATUAL
# BEGIN ANSIBLE MANAGED BLOCK
Some text\tmore text
# END ANSIBLE MANAGED BLOCK
DESEJADO
# BEGIN ANSIBLE MANAGED BLOCK
Some text more text
# END ANSIBLE MANAGED BLOCK
este playbook obtém RAM total e, com base nisso, define duas variáveis, digamos A e B A é 40% da RAM total B é 60% da RAM total
tarefa é, se A maior ou igual a 32, então A deve ser 32, mas se for menor que 32, então mantenha A como resultado de 40% da RAM total o mesmo vale para B, se B for maior ou igual a 32, então B deve ser 32, mas se for menor que 32, mantenha B como resultado de 60% da RAM total
- name: get total RAM
set_fact:
total_ram_mb: "{{ ansible_memtotal_mb }}"
- name: calculate min & max values
set_fact:
A: "{{ (total_ram_mb * 0.4 / 1024) | int }}"
B: "{{ (total_ram_mb * 0.6 / 1024) | int }}"
- debug:
var: A
- debug:
var: B
- name: limit min value
set_fact:
A: "{{ 32 if A >= 32 else A }}"
- name: limit max value
set_fact:
B: "{{ 32 if B >= 32 else B }}"
- debug:
var: A
- debug:
var: B
mas as tarefas posteriores AB são sempre definidas como 32, não importa se A é maior, igual ou menor, a memória no meu vms é 8G, não tenho certeza de onde está o problema
aqui está a saída do jogo
[root@autom ansible]# ansible-playbook -i inv.txt memory.yml
PLAY [es] ********************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************
ok: [es1]
ok: [es2]
TASK [memory : get total RAM] *****************************************************************************************************************
ok: [es1]
ok: [es2]
TASK [memory : calculate min & max values] ****************************************************************************************************
ok: [es1]
ok: [es2]
TASK [memory : debug] *************************************************************************************************************************
ok: [es1] => {
"A": "3"
}
ok: [es2] => {
"A": "3"
}
TASK [memory : debug] *************************************************************************************************************************
ok: [es1] => {
"B": "4"
}
ok: [es2] => {
"B": "4"
}
TASK [memory : limit min value] ***************************************************************************************************************
ok: [es1]
ok: [es2]
TASK [memory : limit max value] ***************************************************************************************************************
ok: [es1]
ok: [es2]
TASK [memory : debug] *************************************************************************************************************************
ok: [es1] => {
"A": "32"
}
ok: [es2] => {
"A": "32"
}
TASK [memory : debug] *************************************************************************************************************************
ok: [es1] => {
"B": "32"
}
ok: [es2] => {
"B": "32"
}
tenho 2 diretórios
$ tree dir{1..2}
dir1
├── file1
└── file2
dir2
├── file1
└── file2
Eu quero comparar todos os arquivos em dir1 com todos os arquivos em dir2 usando ansible e diferenças de impressão como esta
output:
${file1} from ${dir1}:
diff content
${file1} from ${dir2}:
diff content
e fará um loop por todos os arquivos para imprimir suas diferenças
abaixo está um snippet ansible que precisa ser modificado
---
- name: Compare files in two directories
hosts: localhost
gather_facts: false
tasks:
- name: Find files in directory 1
find:
paths: ~/dir1
file_type: file
register: dir1_files
- name: Find files in directory 2
find:
paths: ~/dir2
file_type: file
register: dir2_files
- name: Compare files
shell: diff dir1/file1 dir2/file1 ## how can I make sure path changes but filenames stay same using variables
loop: "{{ dir1_files.files }}"
register: diff_output
changed_when: false
failed_when: diff_output.rc == 1
- name: Print differences
debug:
msg: |
{{ item.item.path }} from dir1:
{{ item.stdout }}
{{ item.item.path }} from dir2:
{{ item.stdout }}
loop: "{{ diff_output.results }}"
when: item.stdout_lines | length > 0
Para o código sugerido na resposta de Vladimir, recebo a saída abaixo
TASK [debug] *****************************************************************************************************************************************
ok: [localhost] => {
"msg": "file2 from dir1: \n 1,2c1,2\n < abc123\n < def456\n ---\n > abc101\n > def111\nfile2 from dir2: \n 1,2c1,2\n < abc123\n < def456\n ---\n > abc101\n > def111\nfile1 from dir1: \n 1,2c1,2\n < 123abc\n < 456def\n ---\n > 101abc\n > 111def\nfile1 from dir2: \n 1,2c1,2\n < 123abc\n < 456def\n ---\n > 101abc\n > 111def\n"
}
Eu tenho um host db, no qual alguns arquivos sql estão presentes. Eu quero procurá-lo em db usando um playbook ansible. então eu encontro todos os arquivos e registro na variável, então tento procurá-los usando o código abaixo.
- name: get schema files
find:
paths: "~/dbs/"
recurse: no
patterns: "*.sql"
register: db_sql_files
- name: import schemas
mysql_db:
name: all
state: import
target: "{{ item['path'] }}"
login_user: "{{ db_user }}"
login_password: "{{ db_pass }}"
with_items: "{{ db_sql_files['files'] }}"
quando executo o playbook, recebo o erro abaixo.
The task includes an option with an undefined variable. The error was: 'item' is undefined
Tenho hosts, onde posso configurar o aplicativo em uma arquitetura de nó único ou distribuído. Então eu tenho um inventário.
[STG]
node1
[LIVE]
app_node
db_node
gateway_node
portanto, uma variável com valor padrão single
pode ser alterada na CLI paradistributed
Eu tenho uma definição de papel
- hosts:
gather_facts: no
roles:
- {role: setup, tags: ['setup', 'orchestra']}
então eu quero que a linha do host seja dinâmica com base no valor do mapa
- hosts: 'if single then host == STG else LIVE'
Eu tenho o arquivo principal, que pode iniciar diferentes funções individuais.
---
- hosts: all
gather_facts: False
roles:
- role: "{{ rnames }}"
...
quando executo funções individuais, funciona bem
ansible-playbook -i inv initiate.yml -e rnames=install_packages
Mas o que eu prefiro é executar vários papéis, fornecendo uma lista de papéis para rname
variáveis
ansible-playbook -i inv initiate.yml -e rnames=install_packages,config_merge
Eu tentei with_items
& loop
constrói, mas não consigo descobrir.
Estou executando um daemon que processa arquivos em um diretório específico. Eu quero processá-los um por um. então a idéia é copiar os arquivos 1 por 1 no diretório do daemon e seguir seu log, o segundo arquivo deve ser copiado para o diretório do daemon quando o arquivo de log terminar de ser processado primeiro, ou seja, o arquivo de log parar de atualizar.
como posso conseguir isso? dizer
daemon_dir=/var/daemon_dir/
daemon_log_file=/var/daemon/daemon_log
e eu tenho 5 arquivos para processar, ou seja, arquivo{1..5}
# ls -1
file1
file2
file3
file4
file5
então meu loop deve ir como está.
for file in file{1..5}
do
cp ${file} ${daemon_dir}
# daemon sees new file arriving in its dir, & starts processing
# log is tailed
tail -f ${daemon_log_file}
# when log file stops updating say for 1minute or specified time, tail quits
done
e o loop começa com o próximo arquivo.
Eu tenho 2 arquivos, tentando definir o valor da coluna que é retirado do arquivo2 para o arquivo1 quando suas colunas correspondem
file1:
signup||20200620|A3332|en|LA||ACTIVE
signup||20200620|B4443|en|CA|66001|ACTIVE
signup||20200620|C2221|en|WC||ACTIVE
signup||20200620|D1110|en|LA||ACTIVE
signup||20200620|E5554|en|WC|66003|ACTIVE
file2:
A3332||99001
B4443|66001|99003
D1110|66004|99007
E5554||99004
CRITÉRIOS: $4 do arquivo1 deve corresponder a $1 do arquivo2, após a correspondência deve definir $7 do arquivo1 igual a $3 do arquivo2
DESEJADO:
signup||20200620|A3332|en|LA|99001|ACTIVE
signup||20200620|B4443|en|CA|99003|ACTIVE
signup||20200620|C2221|en|WC||ACTIVE
signup||20200620|D1110|en|LA|99007|ACTIVE
signup||20200620|E5554|en|WC|99004|ACTIVE
o que estou tentando
awk 'BEGIN{ FS=OFS="|" } NR==FNR{a[NR]=$1; b[NR]=$3; next} {if (a[FNR] = $4); $7=b[FNR]; print}' file2 file1
O que estou recebendo
signup||20200620|A3332|en|LA|99001|ACTIVE
signup||20200620|B4443|en|CA|99003|ACTIVE
signup||20200620|C2221|en|WC|99007|ACTIVE
signup||20200620|D1110|en|LA|99004|ACTIVE
signup||20200620|E5554|en|WC||ACTIVE
Estou coçando a cabeça se for um erro lógico ou outra coisa
Eu tenho um arquivo enorme para analisar e preciso pesquisar e substituir texto, mas em campos específicos, compartilhando uma pequena amostra para referência chamada dest. a primeira linha é o cabeçalho para referência.
cat dest
ID|NAME|COMPANY|NUMBER
1001|Adam||15001
1002|eve|adam&eve|15002
1003|||
1004|||50000
1005|||50001
Eu tenho arquivos separados que contêm padrão para corresponder, texto a ser substituído e texto a ser substituído
cat src
1003||15003
1004|50000|15004
1005|50001|15005
para que eu possa executar um loop while abaixo com sed para alcançar as últimas 2 linhas do arquivo src.
cat src | while IFS=$'|'; read id old new; do sed -i "/^${id}/s/${old}/${new}/" dest; done
mas para ID=1003
recebo uma string vazia para $old
, e ele substituirá todas as colunas vazias no arquivo dest para esse ID. O que eu quero evitar. O que eu quero fazer é substituir apenas o último campo.
DESEJADO:
ID|NAME|COMPANY|NUMBER
1001|Adam||15001
1002|eve|adam&eve|15002
1003|||15003
1004|||15004
1005|||15005
Eu poderia usar o awk, pois é mais granular, quando se trata de dados colunares. mas o awk imprimirá várias vezes para stdout, tanto quanto eu entendo, o que também não é prático no meu caso.
então existe uma maneira de fazer isso de maneira inteligente e concisa?
Eu quero construir uma função que mudará seu prompt de entrada do usuário com base em seu parâmetro.
my_fucntion
leva 1 parâmetro como db_host
depois de solicitar a entrada do usuário:
function provide_host () {
echo "Enter NAME OR IP OF ${function_param1} DATBASE HOST: "
read global function_param1_db_host
}
Então, se eu chamar a função como
function provide_host (primary)
ele deve solicitar como
echo "Enter NAME OR IP OF PRIMARY DATBASE HOST: "
mas se eu usar
function provide_host (secondary)
ele solicita
"Enter NAME OR IP OF SECONDARY DATBASE HOST: "
Minha ideia é que eu tenha que usar uma if
declaração para isso, mas não tenho certeza se posso usar o parâmetro da função como uma variável para prompt no usuário dentro da função.
arquivo1:
G A 4
H B 3
I C 2
J D 1
arquivo2:
M H 6
N H 5
O K 4
P J 3
Q I 2
R I 1
S G 0
T L 1
Desejado:
M H 6
N H 5
P J 3
Q I 2
R I 1
S G 0
imprimir apenas linhas em que $ 2 do arquivo2 corresponde a $ 1 do arquivo1
Estou tentando construir a instrução if, mas isso me dá erro de sintaxe para abaixo
awk 'NR==FNR{a[NR]=$1; b[NR]=$2; next} ; {if{a[FNR]==b[FNR]}; {next}; { print }' file1 file2
syntax error at source line 1
context is
NR==FNR{a[NR]=$1; b[NR]=$2; next} ; >>> if <<< {a[FNR]==b[FNR]; next}; { print }
ou sem saída se não usar se verbo
awk 'NR==FNR{a[NR]=$1; b[NR]=$2; next} ; {a[FNR]==b[FNR]; next}; { print }' file1 file2
Eu tenho um arquivo delimitado por pipe
d1000|1000
d1001|100
d1002|10
d1003|1
d1004|
d1005|
Eu quero modificar $ 2 se o comprimento for menor que 4 dígitos e também manter os espaços vazios como estão
então tentando fazer isso via script awk
BEGIN { FS="|"; OFS="\t" }
{
n=1100
{ if (length($2)!=4 && length($2)>0) {$2=++n}};
print $1, $2
}
mas está imprimindo o mesmo número repetidamente
d1000 1000
d1001 1101
d1002 1101
d1003 1101
d1004
d1005
enquanto a saída desejada
d1000 1000
d1001 1101
d1002 1102
d1003 1103
d1004
d1005
EDIT: aqui está o código acima formatado de forma legível por gawk -o-
:
BEGIN {
FS = "|"
OFS = "\t"
}
{
n = 1100
if (length($2) != 4 && length($2) > 0) {
$2 = ++n
}
print $1, $2
}
tenho um arquivo assim
d1000 1000
d1001 100
d1002 10
d1003 1
Eu quero modificar a segunda coluna onde o comprimento não é igual a 4. Mas eu quero imprimir apenas as linhas que são modificadas, então o texto original na coluna 2 fica na coluna 2, e a mudança é impressa na 3ª coluna com um incremento para um número.
Saída Desejada:
d1001 100 1101
d1002 10 1102
d1003 1 1103
Estou tentando nesse sentido, mas não consigo obter a sintaxe ou os resultados
awk -v n=1100 '((length($2)!=4 && length($2)>0) {new=($2=++n)}; {print $1, $2, new}' file
Tenho dados não padrão, que gostaria de padronizar
Arquivo:
d101 11001
e101 9665
f101 9663
d102 11002
e102 11003
f102 11004
g102 11005
saída desejada:
d101 11001
e101 12001
f101 12002
d102 11002
e102 11003
f102 11004
g102 11005
então a lógica deve ser, se o comprimento da coluna2 = 4 deve substituí-lo com numeração incremental de uma série fornecida: neste caso 1200 é a série, & 1, 2, 3 .. são incrementos.
Eu tenho um arquivo com valores, alguns são números inteiros e alguns são decimais
# cat file
value1 100
value2 500.10
value3 2505
value4 35.4
Eu quero dividir cada valor no campo2 com um número fixo = 1000, também somar todos os valores após a divisão. os valores resultantes devem conter 5 dígitos após os decimais
# cat output.txt
value1 100 0.10000
value2 500.10 0.50010
value3 2505 2.50500
value4 35.4 0.03450
sum 3140.50000 3.14050
Eu tenho 2 arquivos, a primeira linha é uma linha de cabeçalho para referência
file1
userId userContact parentId parentContact 200 0900200 100 - 201 0900201 100 - 300 0900300 101 -
file2
userId userContact parentId parentContact 100 0900100 100 - 101 0900101 100 -
Eu quero preencher a 4ª coluna de file1
, para que ele tenha que pesquisar em $3
de e, em seguida, trazer de no lugar de para
que a saída fique assim:file1
$1
file2
$2
file2
$4
file1
output
userId userContact parentId parentContact 200 0900200 100 0900100 201 0900201 100 0900100 300 0900300 101 0900101
Eu prefiro awk
, pois será mais rápido.
Eu tenho 2 arquivos contendo list. A coluna 1 é userIds e a coluna 2 são valores associados
# cat file1
e3001 75
n5244 30
w1453 500
#cat file2
d1128 30
w1453 515
n5244 30
e3001 55
Coisas a considerar.
- userIds podem não ser classificados exatamente em ambos os arquivos
- O número de userIds pode variar nos arquivos
REQUERIDOS
- em primeiro lugar, o userId do arquivo1:column1 deve corresponder ao UserId no arquivo2:column1
- em seguida, compare seus valores em file1:column2 com file2:column2
- print onde os valores tem variância. também userIds extras, se houver
RESULTADO:
e3001 has differnece, file1 value: 75 & file2 value: 55
w1453 has differnece, file1 value: 500 & file2 value: 515
d1128 is only present in filename: file1|file2
solução com 1liner-awk ou loop bash é bem-vinda
Estou tentando fazer um loop, mas está cuspindo lixo, acho que há algum erro de lógica
#!/usr/bin/env bash
## VARIABLES
FILE1=file1
FILE2=file2
USERID1=(`awk -F'\t' '{ print $1 }' ${FILE1}`)
USERID2=(`awk -F'\t' '{ print $1 }' ${FILE2}`)
USERDON1=(`awk -F'\t' '{ print $2 }' ${FILE1}`)
USERDON2=(`awk -F'\t' '{ print $2 }' ${FILE2}`)
for user in ${USERID1[@]}
do
for (( i = 0; i < "${#USERID2[@]}"; i++ ))
#for user in ${USERID2[@]}
do
if [[ ${USERID1[$user]} == ${USERID2[i]} ]]
then
echo ${USERID1[$user]} MATCHES BALANCE FROM ${FILE1}: ${USERDON1[$i]} WITH BALANCE FROM ${FILE2}: ${USERDON2[$i]}
else
echo ${USERID1[$user]}
fi
done
done
Abaixo está o arquivo copiado diretamente da caixa linux. É separado por tab, mas o awk também funciona com tab, até onde eu sei.
#cat file1
e3001 55
n5244 30
w1453 515
Eu tenho 2 arrays para prcoess no script bash simultaneamente. O primeiro array contém tipos de rótulos. A segunda matriz contém valores, como em
LABELS=(label1 label2 label3 labe4 )
VALUES=(91 18 7 4)
O que é necessário é: um loop que ecoará o item indexado da matriz LABELS & e na frente desse valor correspondente para esse item da matriz VALUES, como em
label1 91
label2 18
label3 7
label4 4
Acho que o loop aninhado não funcionará, tentei abaixo, mas não funcionará pela sintaxe
for label in {LABELS[@]} && value in {VALUES[@]}
do
echo ${label} ${value}
done