Как искать появление двух строк с использованием AND в строке [duplicate]

Я думаю, вы можете использовать

public static class MyFragment extends Fragment {
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

      Context context = getActivity.getContext();

  }
}
87
задан 25 June 2011 в 22:36
поделиться

8 ответов

Почему вы проходите -c? Это просто покажет количество матчей. Точно так же нет причин использовать -r. Я предлагаю вам прочитать man grep.

Чтобы grep для двух слов, существующих в одной строке, просто выполните:

grep "word1" FILE | grep "word2"

grep "word1" FILE будет печатать все строки с word1 в их из FILE, а затем grep "word2" напечатает строки, в которых есть слово2. Следовательно, если вы объедините их с помощью канала, он отобразит строки, содержащие как word1, так и word2.

Если вам просто нужно подсчитать, сколько строк имеет 2 слова в одной строке, выполните:

grep "word1" FILE | grep -c "word2"

Кроме того, чтобы ответить на вопрос, почему он застревает: в grep -c "word1" вы не указали файл. Поэтому grep ожидает ввода от stdin, поэтому он, кажется, виснет. Вы можете нажать Ctrl + D, чтобы отправить EOF (конец файла), чтобы он ушел.

120
ответ дан houbysoft 19 August 2018 в 00:10
поделиться
  • 1
    Когда вы сбиты с толку, страницы руководства - это в значительной степени последнее место, которое вы хотите найти для разъяснения. Они более запутанны, чем случайные догадки. – corsiKa 25 June 2011 в 22:45
  • 2
    @TotalFrickinRockstarFromMars: Я не согласен. Это правда, что в начале они могут показаться запутанными, но как только вы привыкнете к используемому ими формату, это довольно просто. Во всяком случае, я включил его в ответ больше, чтобы «научить человека, как ловить рыбу». бит, я ожидал, что OP их не знает, а man-страницы могут стать очень удобными. – houbysoft 25 June 2011 в 22:53
  • 3
    @houbysoft Тогда нам придется согласиться не согласиться. Я использую Linux и друзей в течение большей части 8 лет, и я по-прежнему предпочитаю Google, чем использовать man-страницы. – corsiKa 25 June 2011 в 23:10
  • 4
    @TotalFrickinRockstarFromMars: Ну, я не отрицаю этого. Во всяком случае, не могли бы вы указать на какую-то определенную вещь, которую вы находите и запутываете? например, на странице grep man? – houbysoft 26 June 2011 в 00:19
  • 5
    @houbysoft: что делать, если мне нужно сделать подсчет – user 26 June 2011 в 04:58
  • 6
    – corsiKa 2 July 2018 в 17:36

вы можете использовать awk. как это ...

cat <yourFile> | awk '/word1/ && /word2/'

Порядок не важен. Итак, если у вас есть файл и ...

файл с именем, файл1 содержит:

word1 is in this file as well as word2
word2 is in this file as well as word1
word4 is in this file as well as word1
word5 is in this file as well as word2

, тогда

/tmp$ cat file1| awk '/word1/ && /word2/'

приведет к тому,

word1 is in this file as well as word2
word2 is in this file as well as word1

Да, awk работает медленнее.

8
ответ дан Colin MacKenzie - III 19 August 2018 в 00:10
поделиться

Чтобы grep два слова в одно и то же время, используйте эту команду оболочки:

eval "</dev/stdin $(printf "|grep '%s'" word1 word2)" FILE

Если вы используете это чаще, это можно определить как псевдоним:

alias grep-all="</dev/stdin $(printf "|grep '%s'" word1 word2)"

Затем выполните просто:

grep-all FILE

Если у вас несколько паттернов, хранящихся в файле, см.: Совпадают все шаблоны из файла сразу .

Также проверьте: Как запустить grep с несколькими шаблонами AND?

0
ответ дан Community 19 August 2018 в 00:10
поделиться

Основная проблема заключается в том, что вы не поставили первый grep с любым вводом. Вам нужно будет переупорядочить свою команду как

grep "word1" logs | grep "word2"

. Если вы хотите подсчитать вхождения, тогда поставьте '-c' на второй grep.

49
ответ дан Jonathan Leffler 19 August 2018 в 00:10
поделиться
  • 1
    Каково использование & quot; $ @ & quot; Вы можете объяснить. Вы не указали имя файла. – Prabhat Kumar Singh 27 October 2014 в 10:11
  • 2
    @PrabhatKumarSingh: внутри скрипта оболочки "$@" расширяется до всех аргументов, переданных сценарию оболочки (которые не были сдвинуты). Это может быть список имен файлов, или он может быть пустым, и в этом случае grep будет считываться со стандартного ввода. В исходном коде в вопросе также не упоминаются имена файлов. Поэтому он будет считываться со стандартного ввода. – Jonathan Leffler 27 October 2014 в 15:18
  • 3
    ok Я понимаю, что означает $ @ в сценарии оболочки, но я не видел script , упомянутого в вашем ответе, поэтому смутился. – Prabhat Kumar Singh 27 October 2014 в 15:25
  • 4
    Плюс 1 для более эффективного способа выполнения grep grep. – David Fairbanks 9 September 2015 в 16:07
  • 5
    Еще одна положительная сторона этого решения заключается в том, что он работает, если оба слова одинаковы, что означает, что он также может определить, повторяется ли слово в строке. Принятое решение не справляется с этим делом. +1. – Diego Pino 18 June 2016 в 11:11

Используйте grep:

grep -wE "string1|String2|...." file_name

Или вы можете использовать:

echo string | grep -wE "string1|String2|...."
1
ответ дан MERose 19 August 2018 в 00:10
поделиться
  • 1
    Эти команды выполняют поиск хотя бы одного слова, а не для всех – Mat M 10 June 2016 в 12:38

grep word1 file_name | grep word2

, который кажется мне самым простым способом

2
ответ дан R3tep 19 August 2018 в 00:10
поделиться

Попробуйте кошку с помощью команды

cat log|grep -e word1 -e word2
5
ответ дан Taryn 19 August 2018 в 00:10
поделиться
  • 1
    Эти команды ищут хотя бы одно слово, а не для всех. и кошка | не требуется, вы можете указать файл как последний аргумент grep – Mat M 10 June 2016 в 12:40
  • 2
    Наверное, бесполезное использование кошки ?! – Ganapathy 30 August 2017 в 11:11
55
ответ дан Jonathan Leffler 30 October 2018 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: