O arquivo que você mostrou tem todos os detalhes em uma linha:
name : farah age : 23 phone number : 0123 education : degree
Eu assumi que você pode codificar age :etc no comando, mas o texto a seguir varia, e os detalhes podem não estar na ordem especificada ou serem contíguos.
Você pode extrair partes da linha com grepo -osinalizador de. Isso imprime apenas a parte correspondente, em vez da linha inteira.
Se você deseja incluir as peças age :e phone number :, pode usar o -esinalizador para especificar várias correspondências ou alternância.
$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123
A expressão [^ ]*significa qualquer número de caracteres que não são um espaço, portanto, corresponde aos caracteres após age :o próximo espaço.
Substitua filepelo nome do arquivo que contém seus detalhes. Você pode gravar o novo arquivo redirecionando a saída para um novo arquivo com o >operador, assim:
grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile
Ao fazer isso, você não verá nenhuma saída. Você deve verificar a saída primeiro e depois adicionar o redirecionamento.
Aqui está o exemplo com alternância. Usamos a -Eflag para dizer greppara usar regex estendido. A sintaxe é (pattern1|pattern2)- isso corresponde pattern1e / ou pattern2. Se um for encontrado, ele será impresso (independentemente de o outro ser encontrado ou não). Agora estou usando o +significado de pelo menos um dos caracteres anteriores, em vez de *significar zero ou mais do caractere anterior. Nesse contexto, os dois funcionam igualmente bem.
$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23
phone number : 0123
Se você quiser omitir as partes age :e phone number:, poderá usar o -Psinalizador para solicitar o grepuso de expressões regulares compatíveis com Perl. Isso suporta alternância e também uma maneira de corresponder texto após um determinado padrão:
$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123
Se você deseja formatar o texto de maneira diferente, pode usar sed, por exemplo:
$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123
Isso depende da agevinda anterior phone number, portanto, ajuste de acordo se não for esse o caso. Se você não pode confiar no pedido, pode usar este comando muito complicado:
$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23
Isso reorganiza a linha para que a phone number :seção seja a primeira em cada linha e, em seguida, faz uma segunda substituição para selecionar os detalhes desejados. Devo a técnica usada aqui a esta resposta por muru .
Notas sobre sedcomandos não cobertos por explicações anteriores
-ruse regex estendido para comandos mais legíveis (o GNU sedentende -Ecom o mesmo significado)
s/old/new/substitua oldpornew
(pattern)salva patternpara fazer referência mais tarde, com \1ou \2etc (correspondente à ordem da esquerda para a direita na qual os grupos de captura ocorrem - observe que sedconterão apenas 7 deles!).
.qualquer caractere, portanto, .*representa qualquer número de caracteres.
; separa comandos, como no shell.