Método para o conteúdo do diretório ls e awk em uma variável do shell

1

Eu estou lutando para encontrar alguma maneira de expressar isso de alguma outra forma que trará a saída apropriada:

var="$(ls /var/run/ | grep searchterm | awk {'NR == 2'})"

Eu vi em lugares como shellcheck para usar um glob ou loop, mas a minha pesquisa até agora não veio com nada para fazer isso para que eu possa obter o resultado como uma variável, em vez de apenas ecoar ou imprimir o conteúdo.

Existem métodos para fazer isso?

Jarrad S
fonte
Qual é o seu objetivo final que você deseja realizar ao capturar essas informações em uma variável shell? Se você editar e expandir sua pergunta para cobrir por que deseja fazer isso, a resposta pode ficar mais clara. Obrigado.
StandardEyre
É parte de um plugin Icinga personalizado que estou escrevendo para mim. Existem 4 arquivos no diretório - 3 têm nomes estáticos - 1 não. Eu preciso avaliar o conteúdo desses arquivos para o plugin. O arquivo não estaticamente nomeado possui alguma parte do nome do arquivo que é estático para si mesmo e separado do resto, que é o que o greterterterm é. A variável em si é usada para tomar algumas outras ações posteriormente.
Jarrad S
(1) Por que você está fazendo NR == 2? (2) Se você usa awk, você deve colocar o awkprograma inteiro entre aspas; por exemplo, '{NR == 2}'com as chaves dentro das aspas.
G-Man

Respostas:

0
var="$( find /var/run -iregex "$YOUR_REGEX" 2> /dev/null )"

Claro, man findpara aprender algumas limitações da -iregexopção.

Se o searchterm não for muito complexo, você poderá usar em seu -iname "*$SEARCHTERM*"lugar.

Em geral, analisar a saída lsé algo que você realmente deve evitar.

pepoluan
fonte
1
Isso funcionou. Eu tive que usar uma bandeira do tipo também, mas deu certo.
Jarrad S
0

Se a sua situação é

Existem quatro arquivos no diretório - três têm nomes estáticos (por exemplo red, bluee green) e um não. Mas eu sei que o quarto terá fooem seu nome. Eu quero pegar o quarto nome de arquivo. Obviamente, posso procurar com segurança foo, porque nenhum dos nomes estáticos contém foo.

então tudo que você precisa fazer é

var="$(echo /var/run/*foo*)"

Se você está apenas trabalhando no diretório atual, e você faz

var="$(echo *foo*)"

e o quarto nome de arquivo pode começar com um -traço, o acima pode falhar. (Além disso, qualquer um dos comandos acima pode falhar se o nome do arquivo puder conter \(barra invertida).)

var="$(printf '%s' *foo*)"

ou

var="$(printf '%s' /var/run/*foo*)"

Deveria trabalhar.

Obviamente, se o quarto nome de arquivo começar com um .(ponto), você terá outro problema.

G-Man
fonte