Eu sei que com grep eu posso usar os campos -A
e -B
puxar as linhas anteriores e seguintes de uma partida.
No entanto, eles puxam todas as linhas entre a correspondência com base no número de linhas especificadas.
grep -r -i -B 5 -A 5 "match"
Eu gostaria de receber apenas a 5 ª linha antes de um jogo ea 5 ª linha após a partida em adição à linha combinado e não obter as linhas entre.
Existe uma maneira de fazer isso com o grep
?
command-line
grep
awk
Chollida
fonte
fonte
grep -r -i -B 5 -A 5 "match" | sed -e 1b -e '$!d'
Respostas:
A ferramenta que você deseja usar é chamada peneirar. Este é basicamente um grep com esteróides. Grep em paralelo. O Sift tem uma enorme quantidade de opções para fazer exatamente o que você deseja - especificamente para retornar uma linha específica em relação a uma (s) correspondência (s) que pode / não pode ser seguida / precedida por algum texto.
Surpreende-me que o sift não seja o gnu convencional, pois foi escrito na linguagem go, mas é instalado no Linux muito bem. A TI pesquisa em paralelo usando todas as enormes quantidades de texto de cpus, onde o grep leva apenas algumas semanas para fazer o mesmo.
Peneire o site - veja exemplos
fonte
E se:
Então:
fonte
/match/ {matched[NR]}
? Eu nunca vi uma matriz ou variável como um comando inteiro. É colocar o número do registro atual de cada linha correspondente na matriz.key in array
. O que estou fazendo é lembrar os números de linha onde o padrão apareceEsta é basicamente a solução de Glenn, mas implementada com Bash, Grep e sed.
Observe que números de linhas menores que 1 cometerão erros sed e números de linhas maiores que o número de linhas no arquivo não imprimirão nada.
Este é apenas o mínimo. Para fazê-lo funcionar recursivamente e lidar com o número de linhas acima, levaria algum tempo.
fonte
Não pode ser feito apenas
grep
. Se fored
uma opção:O script basicamente diz: para cada correspondência de / match /, imprima a linha 5 linhas antes disso, depois 5 linhas depois disso, depois 5 linhas depois disso.
fonte
ed
é sempre uma resposta, porqueed
é o editor de texto padrão.grep
resposta, a resposta "Você não pode fazer isso com X, mas com Y, veja como" ainda é uma resposta válida, pois você não apenas responde à pergunta da OP, mas também fornece uma alternativa Isso funcionaria. Este é um tipo válido de resposta aqui.Aqui estamos usando a função do awk para chamar o comando externo para imprimir as linhas que o awk combinou com o padrão com a quinta linha antes e depois da partida.
system(command)
sed
match
A sintaxe é fácil, você só precisa colocar o comando externo entre aspas duplas, assim como suas opções, e escapar do que deseja passar exatamente para o comando; tudo o mais relacionado às
awk
opções em si deve estar fora das aspas. Então, o abaixo sed :traduzir para:
NR
é o número da linha que corresponde ao padrãomatch
eFILENAME
é o nome do arquivo de processamento atual que está passandoawk
.fonte
usando o arquivo de texto de exemplo de @ glenn e usando perl em vez de awk:
dará os mesmos resultados, mas rodando mais rápido:
fonte