Como grep texto que está sempre mudando de uma linha com texto específico?

4
contentJSON is :-
{"id":"0","name":"inc_timestamp","workspaceId":"37158928","infoJSON":"{a:{\"a\":\"bcd\",\"b\":{\"c\":\"d\"}}}","contentJSON":"{\n  \"tasks\": [\n    {\n      \"name\": \"Input\",\n      \"taskType\": \"executeCustomSQLQueryForIncrementalLoad\",\n      \"id\": 10,\n      \"x\": 95,\n      \"y\": 44,\n      \"inputConnectors\": [],\n      \"outputConnectors\": [\n        {\n          \"nodeID\": 11,\n          \"type\": \"Output\",\n          \"name\": \"\"\n        }\n      ],\n      \"argsMap\": {\n        \"taskId\": 10,\n        \"datasetId\": 49053696,\n        \"deltaColumnName\": \"timestamp\",\n        \"deltaColumnDataType\": \"timestamp\",\n        \"deltaColumnValue\": \"null\",\n        \"primaryKeysList\": [\n          \"id\"\n        ]\n      },\n      \"datasetId\": 49053696\n    },\n    {\n      \"name\": \"Output\",\n      \"taskType\": \"saveToES\",\n      \"id\": 11,\n      \"x\": 453,\n      \"y\": 44,\n      \"inputConnectors\": [\n        {\n          \"nodeID\": 10,\n          \"type\": \"Input\",\n          \"name\": \"\"\n        }\n      ],\n      \"outputConnectors\": [],\n      \"argsMap\": {\n        \"bizvizcubeId\": 46759937,\n        \"cfg\": {\n          \"es.mapping.id\": \"id\"\n        }\n      }\n    }\n  ],\n  \"connections\": [\n    {\n      \"source\": {\n        \"taskId\": 10,\n        \"connectorIndex\": 0\n      },\n      \"dest\": {\n        \"taskId\": 11,\n        \"connectorIndex\": 0\n      }\n    }\n  ],\n  \"isIncrementalLoadModeWorkflow\": 1\n}\n"}
Status:200
{"wokspaceResp":{"success":true,"workspaces":[],"params":"{\"id\":\"49086475\"}"}}
{"wokspaceResp":{"success":true,"workspaces":[],"params":"{\"id\":\"49086475\"}"}}
{"success":true,"workspaces":[],"params":"{\"id\":\"49086475\"}"}
{"id":"49086475"}
wfid is : 49086475
finally wfid is : 49086475
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.136s
[INFO] Finished at: Tue Oct 24 15:30:48 IST 2017
[INFO] Final Memory: 33M/392M
[INFO] ------------------------------------------------------------------------

Eu precisava do grep 49086475 , que muda toda vez que eu executo meu programa.

Por favor, me guie para capturar o texto depois de finally wfid is : .

    
por xyz_scala 24.10.2017 / 12:08

5 respostas

8

Use o awk:

awk '/finally wfid is :/{print $NF}'

... que imprime o último campo da linha contendo finally wfid is : .

    
por muru 24.10.2017 / 12:15
7

Use grep desta maneira:

grep -oP 'finally wfid is : \K.*' <filename>
  • A explicação da resposta de origem :

      

    Com grep e o -P por ter PCRE (Interpretar o   padrão como um P erul- C ompatible R egular E xpression) e   o -o para imprimir o padrão correspondente sozinho. O \K notify irá ignorar   a parte combinada vem antes de si mesma.

Ou você pode usar sed desta maneira:

sed -n 's/finally wfid is : //p' <filename>
  • Este comando imprimirá apenas as linhas que contêm a string finally wfid is : , mas será substituído por uma string vazia.
por pa4080 24.10.2017 / 13:26
4

Apesar de todas as boas soluções já postadas, adicionarei uma que use apenas grep . Muitas vezes acabo fazendo as coisas dessa maneira por causa da minha incapacidade de lembrar os comandos sed e awk .

grep 'finally wfid is' input_file | grep -o '[0-9]*'

O primeiro grep tomará a linha correta. O segundo usa o argumento -o para obter o apenas parte correspondente da linha, que aqui é qualquer coisa numérica.

    
por jpa 24.10.2017 / 14:04
3

Basta fazer:

grep "finally wfid is" <filename> | awk '{print ;}'

Isto produzirá o número que está nessa linha sozinho. Se você quiser a linha inteira, apenas omita o awk .

    
por Videonauth 24.10.2017 / 12:14
1

Parece-me que todas as respostas postadas até agora ter perdido o ponto da questão. Ou talvez eu tenha. Eu entendo a pergunta para dizer

  

Eu preciso encontrar o texto (número de oito dígitos)   que aparece depois de finally wfid is :   e, em seguida, grep do arquivo para esse texto.

As respostas postadas fazem bem a primeira parte, mas não terminam o trabalho. IMHO, resposta do muru é a melhor; Eu vou construir sobre isso:

grep "$(awk '/finally wfid is :/{print $NF}' contentJSON)" contentJSON

em que $(command) captura a saída de command (nesse caso, o awk ) e usa-o no comando externo (neste caso, grep ). Parto da pergunta de que o nome do arquivo é contentJSON .

    
por G-Man 24.10.2017 / 23:50