O que o grep faz?

5

Aqui está a descrição de grep de GNU.org :

  

grep pesquisa arquivos de entrada para linhas que contêm uma correspondência para uma determinada lista de padrões. Quando encontra uma correspondência em uma linha, ela copia a linha para a saída padrão (por padrão) ou produz qualquer outro tipo de saída que você tenha solicitado com opções.

Eu tenho este comando que eu uso frequentemente, que dá o nome do monitor atualmente conectado:

xrandr | grep " connected " | awk '{ print }'

Não consigo ver nenhum arquivo nesse comando ou links para eles, então, o que exatamente está acontecendo? O grep é usado para outras coisas além da pesquisa de arquivos?

    
por DevRobot 09.11.2015 / 11:06

2 respostas

14

De man grep (grifo meu):

grep  searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing  a  match to the given PATTERN.  By default, grep prints the
matching lines.

E de os documentos GNU (novamente, ênfase minha):

  

Programas do tipo 2.4

     

grep pesquisa nos arquivos de entrada nomeados as linhas que contêm uma correspondência para   o padrão dado. Por padrão, o grep imprime as linhas correspondentes. Um arquivo   O nome - significa entrada padrão. Se nenhuma entrada for especificada ,    grep pesquisa o diretório de trabalho . se tiver uma linha de comando   opção especificando recursão; caso contrário, grep procura padrão   entrada .

A entrada padrão, nesse caso, é o canal conectado à saída padrão de xrandr .

O grep é supérfluo neste caso; awk pode fazer o trabalho sozinho:

xrandr | awk '/ connected /{print }'
    
por muru 09.11.2015 / 11:10
10

Quando você faz:

xrandr | grep " connected "

você está basicamente redirecionando a saída padrão (descritor de arquivo 1, /dev/stdout ) de xrandr para a entrada padrão (descritor de arquivo 0, /dev/stdin ) de grep , esse é o trabalho do canal. / p>

Como grep recebe entrada da entrada padrão quando nenhum nome de arquivo é fornecido, seu comando será bem-sucedido no que se refere ao arquivo.

Você pode pensar nisso como:

grep 'pattern' /dev/stdin

Você pode obter a saída desejada com grep sozinho (sem awk necessário):

% xrandr | grep -Po '^[^ ]+(?= connected)'
LVDS1

Isso obterá a primeira palavra separada por espaço da linha ( ^[^ ]+ ) seguida por um espaço e depois a palavra connected ( (?= connected) é um padrão lookahead positivo de largura zero garantindo que <space>connected seja correspondido após o desejado porção).

    
por heemayl 09.11.2015 / 11:18