Expressões regulares estendidas (EREs): Como incluo o padrão, mas excluo o superconjunto específico de padrões nas correspondências?

1

A página man do comando pgrep indica que o padrão "especifica uma expressão regular estendida para correspondência com os nomes de processos ou linhas de comando". Aparentemente, Expressões regulares estendidas são uma extensão das expressões regulares usadas no comando grep original do UNIX.

Eu preciso corresponder a string 'myProcess' , mas excluir a string 'test_myProcess' usando Expressões regulares estendidas. Inicialmente, assumi que Expressões Regulares Estendidas suportariam a asserção lookbehind negativa, o que me levou à seguinte expressão regular: (?<!test_)(myProcess) . Isso aparentemente funciona para outras ferramentas de expressão regular (tentei no site do Regex101).

No entanto, quando eu tento com pgrep , recebo o seguinte erro: Invalid preceding regular expression . Depois de olhar algumas páginas de expressões regulares estendidas, parece que a declaração lookbehind negativa não existe para esse tipo de expressão regular (ou pelo menos eu não consegui encontrar nenhuma referência a ela). Eu preciso saber como combinar a string 'myProcess' , mas exclui a string '' test_myProcess 'usando expressões regulares estendidas.

Editar: Exemplos de texto que quero corresponder (ou não corresponder) Correspondência desejada:

  • myProcess
  • /usr/local/bin/myProcess.py
  • / usr / bin / myProcess

Corresponder NÃO desejado:

  • test_myProcess
  • /usr/local/bin/test_myProcess.py
  • / usr / bin / test_myProcess

Neste momento, estou brincando com a ideia de executar o pgrep duas vezes, depois de corresponder 'myProcess' e uma vez coincidindo com 'test_myProcess' e tomando a diferença dos dois resultados como a resposta correta. No entanto, estou definitivamente interessado em soluções alternativas.

Editar: Observe que o nome do processo em si não incluirá 'myProcess' . Ele simplesmente aparecerá na linha de comando para esse processo. O nome do processo provavelmente será python2.7 . E, 'myProcess' não é garantido para ocupar o início ou o fim da cadeia. Além disso, conforme assinalei, quero corresponder a string se 'myProcess' estiver presente, mas não se 'test_myProcess' também estiver presente.

    
por tintedFrantic 17.01.2017 / 20:58

3 respostas

1

Depois de um pouco de discussão com @don_crissti, a solução final foi

ps auxf | grep -E '[m]yProcess' | grep -vE 'test_[m]yProcess'

Primeiro, obterá todas as linhas contendo 'myProcess' e, em seguida, corresponderá a todas as linhas que NÃO contêm as linhas com 'test_myProcess' (o -v inverte a correspondência). O -E acoplado com os colchetes serve simplesmente para impedir a correspondência dos dois processos grep que serão listados na saída ps . Isso acabou sendo muito mais simples do que tentar encontrar um regex para controlá-los. Obrigado a todos pela vossa ajuda.

    
por 17.01.2017 / 22:10
1

(?<!) é um operador perl regexp. A especificação para o padrão ERE pode ser encontrada aqui .

Parece que você quer encontrar processos cuja lista de argumentos comece com myProcess ou contenha /myProcess .

Então:

pgrep -f '(^|/)myProcess'
    
por 17.01.2017 / 22:45
0

Então, você quer pgrep dos processos cujo nome começa com "myProcess"? Em seguida, use o regex ^myProcess :

pgrep '^myProcess'

Em um regex, o caractere ^ significa que o que segue deve ser encontrado no início da string.

Exemplo:

$ pgrep -a app 
3267 nm-applet
3280 /usr/bin/python /usr/share/system-config-printer/applet.py
3297 /usr/lib/mate-panel/wnck-applet
3306 /usr/lib/mate-panel/clock-applet

$ pgrep -a '^app'
3280 /usr/bin/python /usr/share/system-config-printer/applet.py
    
por 17.01.2017 / 21:46