AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1171487
Accepted
H2ONaCl
H2ONaCl
Asked: 2019-09-08 00:38:33 +0800 CST2019-09-08 00:38:33 +0800 CST 2019-09-08 00:38:33 +0800 CST

Problema ao listar um diretório para grep

  • 772

grepparece quebrado na minha máquina. Reinstalá-lo não ajuda. Uma reinicialização não ajuda. As duas primeiras linhas criam um arquivo contendo texto arbitrário e a entrada é terminada com o caractere control-D.

ls -1significa lista em uma coluna. Segue um exemplo...

> cat > file0.txt
asdf
> cp file0.txt file1.txt
> ls -1
file0.txt
file1.txt
> ls -1 | grep f*
> 

Antes de experimentar esse problema, cometi um erro ao invocar o grep com uma cotação incomparável, mas não entendo como esse problema pode sobreviver a uma reinicialização.

Exemplo de cotação sem correspondência...

ls -1 | grep 'file* | wc

Neste exemplo, a listagem de diretórios é canalizada para grep, que canaliza para o programa contador de linha, palavra e byte wc.

command-line grep wc
  • 4 4 respostas
  • 1295 Views

4 respostas

  • Voted
  1. Soren A
    2019-09-08T01:01:49+08:002019-09-08T01:01:49+08:00

    A expressão grep f*, no seu caso, será expandida grep file0.txt file1.txtpelo shell.

    Aparentemente não há nenhuma linha com file0.txtno arquivo file1.txt.

    Eu sei que não é isso que você queria, mas é assim que funciona.

    :~$ mkdir test
    :~$ cd test/
    :~/test$ touch f1
    :~/test$ touch f2
    :~/test$ set -x
    :~/test$ ls | grep f* 
    + ls --color=auto
    + grep --color=auto f1 f2
    
    • 14
  2. Best Answer
    Eliah Kagan
    2019-09-08T08:21:30+08:002019-09-08T08:21:30+08:00

    grepnão usou a saída de de lsforma alguma.

    Quando você executa grep f*em uma situação em que seu shell se expande f*para dois ou mais argumentos, grepconsidera todos, exceto um deles, como nomes de arquivos a serem abertos e lidos. Quando greplê de arquivos nomeados, seu comportamento padrão de leitura da entrada padrão não se aplica, portanto, ele não lê dados canalizados para ele de outro comando.

    Seu grepprograma não está quebrado e o comportamento que você observou é o comportamento correto e esperado, e é por isso que a reinstalação grepe a reinicialização não o alteraram. Seguem detalhes.

    grep f*não passou um argumento de f*para grep.

    grepnunca vi o texto f*. Como diz Soren A , f*é um globo. Os globos são tratados especialmente pelo seu shell. Como f*não foi citado , o shell o expandiu para os nomes dos arquivos no diretório atual que começam com f. Cada um desses nomes foi passado grepcomo um argumento separado. ( Esse tipo de expansão de shell é conhecido como globbing, expansão de nome de arquivo e expansão de nome de caminho.)

    Com base na sua descrição, existem exatamente dois arquivos que correspondem ao f*glob: file0.txte file1.txt. Como esses são os dois únicos arquivos no diretório atual cujos nomes começam com f, os argumentos de linha de comando passados ​​para grepexecução grep f*são exatamente os mesmos que são passados ​​para ele de execução grep file0.txt file1.txt. Se você adicionasse mais desses arquivos ao diretório, grep f*passaria mais do que esses dois nomes de arquivo como argumentos para grep, mas file0.txtainda file1.txtseria incluído entre eles.

    Você canalizou lsa saída para grep, mas grepnão leu do canal.

    Um pipe conecta a saída padrão de um comando à entrada padrão do outro. Like cate muitos outros comandos, grepaceita entrada de duas maneiras:

    1. Você pode passar nomes de arquivos como argumentos de linha de comando e ele lerá esses arquivos. O primeiro argumento não opcional grepé o padrão, mas os argumentos não opcionais subsequentes são tratados como nomes de arquivo dos quais a entrada será obtida.

      (Você não está tentando passar vários padrões para grep, mas se estivesse, poderia usar a -eopção, cujo operando é sempre tratado como um padrão.)

    2. Você não pode passar argumentos de nome de arquivo e ele lerá de sua própria entrada padrão. Essa é a situação em que é eficaz canalizar para arquivos grep. É apenas na ausência de argumentos de nome de arquivo que greplê a entrada padrão.

      É por isso que é possível usar greppara pesquisar um ou mais arquivos, sem bloquear e esperar que você insira a entrada em um terminal. Quando você canaliza para grep, a entrada extra que não faria sentido grepusar vem do comando no lado esquerdo do canal e não do seu terminal. grepainda não o usa, e isso é uma coisa boa.

      (Você não está tentando fazer grepcom que leia a entrada padrão além de um ou mais arquivos nomeados, mas se estivesse, você poderia passar o -argumento.)

    Como você tem dois arquivos no diretório atual cujos nomes começam com f, o glob f*se expande para dois argumentos. O primeiro, file0.txt, é usado como padrão . O segundo, file1.txt, é usado para nomear um arquivo de entrada. Como grepé fornecido um argumento especificando um arquivo de entrada, a primeira das duas situações descritas acima se aplica ("Você pode passar nomes de arquivos como argumentos de linha de comando"). Portanto, grepnunca lê da entrada padrão e nunca usa a saída do ls.

    • 11
  3. JohnP
    2019-09-10T13:25:18+08:002019-09-10T13:25:18+08:00
    ls | grep 'f*'
    

    é má forma.

    ls f*
    

    deve ser preferido.

    Ao usar padrões regex mais complexos, alterne para egrep/ grep -E.

    Enquanto estou aqui, catraramente é necessário. tacé 100x mais útil do que cat. cato abuso é um problema sério em sistemas do tipo Unix. ;)

    • 0
  4. WinEunuuchs2Unix
    2019-11-05T04:25:38+08:002019-11-05T04:25:38+08:00

    *é um caractere especial que é interpretado livremente como um novo comando/instrução. Você quer colocar um \na frente dele:

    ls -1 | grep f\*
    

    No entanto, o que você provavelmente deseja é obter todos os arquivos começando com fem vez de TODOS os arquivos contendo um f, então use outro caractere especial:

    ls -1 | grep ^f
    

    O ^grep instrui para encontrar linhas começando com f.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve