Распечатайте содержимое первого файла, который содержит определенные строки

Если вы не слишком придирчивы к lubuntu, вы можете попробовать рабочий стол LXDE: http://tuxdiary.com/2013/07/09/lxde/ Я сделал то, что вы пытаетесь, я закончил с сломанным логином экран. Я исправил его, а потом получил сломанный звук. Я оставил его на этом этапе и пошел дальше, чтобы установить рабочий стол LXDE на Ubuntu. И чтобы уменьшить объем, вам нужно пролить некоторые тяжелые приложения, которые вы не используете, и некоторые из процессов, которые не должны запускаться при запуске.

1
задан 15 April 2017 в 23:32

9 ответов

Я хотел бы пойти с этим:

grep -lRE '10.17.1|130.236.189' /etc/ | head -1 | xargs cat grep используется с -R для поиска /etc рекурсивно при использовании -E для использования расширенных функций grep. Переключатель -l с grep используется для печати только имен файлов вместо содержимого. Затем подключите его к xargs, а xargs загрузите имя файла в качестве параметра tor cat. После того, как все кошки распечатают его.

Если вам нужно использовать find:

find /etc/ 2> /dev/null | xargs grep -lE '10.17.1|130.236.189' 2> /dev/null | head -1 | xargs cat

Я использовал 2> /dev/null, чтобы игнорировать ошибки разрешений, когда я обычный пользователь. Если вы используете sudo, нет необходимости их использовать;)

2
ответ дан 18 July 2018 в 14:53

Вот что я сделал бы:

$ find -type f -exec bash -c 'grep -q "10\.17\.1\|130\.236\.189" "$1" && printf "\n>>> $1\n" && cat "$1"' sh {} \;

Как это работает, в основном так:

мы позволяем find обрабатывать файлы локализации (-type f) и для каждого из них выполняется команда с использованием флага -exec ... {}\;, что определенная команда будет в форме bash -c 'command1;command2' arg1 arg2, каждый найденный файл передается как аргумент bash -c, а внутри самой команды он ссылается как переменная $1 grep -q будет спокойно проверять файл для основного регулярного выражения 10\.17\.1\|130\.236\.189 и выходить с 0, если текст найден или 1, если не найден. после успешного поиска текста мы печатаем имя файла с помощью команды printf, а затем cat файла.

Тестирование:

$ find -type f -exec bash -c 'grep -q "10\.17\.1\|130\.236\.189" "$1" && printf "\n>>> $1\n" && cat "$1"' sh {} \; >>> ./somefile.txt 10.17.1 some other text >>> ./somefile2.txt another file, 130.236.189 some other text
0
ответ дан 18 July 2018 в 14:53

Я думаю, вы могли бы избежать head и xargs, используя статус выхода grep в качестве логического предиката в команде find, например

find /etc -type f -exec grep -IFq -e '10.17.1' -e '130.236.189' {} \; -exec cat {} \; -quit

Объяснение grep:

-I игнорировать двоичные файлы (обычно они не хотят быть grepping) -F рассматривать шаблоны как фиксированные строки, а не регулярные выражения (избегает необходимости избегать периодов - за счет невозможности использования оператора regex |) -q немедленно выйдет с нулевым статусом, если найдено какое-либо совпадение

Первый файл, в котором grep находит совпадение, приведет к его для выхода с нулевым статусом, что, в свою очередь, приведет к тому, что find выполнит cat в этом файле. Предполагая, что cat успешна, find будет затем quit, чтобы печаталось только содержимое первого файла соответствия.

2
ответ дан 18 July 2018 в 14:53

Я хотел бы пойти с этим:

grep -lRE '10.17.1|130.236.189' /etc/ | head -1 | xargs cat grep используется с -R для поиска /etc рекурсивно при использовании -E для использования расширенных функций grep. Переключатель -l с grep используется для печати только имен файлов вместо содержимого. Затем подключите его к xargs, а xargs загрузите имя файла в качестве параметра tor cat. После того, как все кошки распечатают его.

Если вам нужно использовать find:

find /etc/ 2> /dev/null | xargs grep -lE '10.17.1|130.236.189' 2> /dev/null | head -1 | xargs cat

Я использовал 2> /dev/null, чтобы игнорировать ошибки разрешений, когда я обычный пользователь. Если вы используете sudo, нет необходимости их использовать;)

2
ответ дан 24 July 2018 в 20:30
  • 1
    Я не думаю, что здесь нужен stdbuf, труба прекратится, как только head все равно прочитает свою первую строку. – Byte Commander 15 April 2017 в 23:12
  • 2
    @ByteCommander, да, вы правы, обновлены и спасибо;) – Ravexina 15 April 2017 в 23:13
  • 3
    Синоним: cat "$(grep -lRE '10.17.1|130.236.189' /etc/ | head -1)" – wjandrea 15 April 2017 в 23:21
  • 4
    @ Ravexina Я думаю, что предыдущая версия команды, которая включала find, была лучше. – NSH 15 April 2017 в 23:31
  • 5
    Не забывайте избегать периодов, например. 130\.236\.189, иначе они будут интерпретироваться как специальные символы регулярных выражений (которые соответствуют любому одиночному символу, а не только буквалу .) – steeldriver 16 April 2017 в 17:58

Вот что я сделал бы:

$ find -type f -exec bash -c 'grep -q "10\.17\.1\|130\.236\.189" "$1" && printf "\n>>> $1\n" && cat "$1"' sh {} \;

Как это работает, в основном так:

мы позволяем find обрабатывать файлы локализации (-type f) и для каждого из них выполняется команда с использованием флага -exec ... {}\;, что определенная команда будет в форме bash -c 'command1;command2' arg1 arg2, каждый найденный файл передается как аргумент bash -c, а внутри самой команды он ссылается как переменная $1 grep -q будет спокойно проверять файл для основного регулярного выражения 10\.17\.1\|130\.236\.189 и выходить с 0, если текст найден или 1, если не найден. после успешного поиска текста мы печатаем имя файла с помощью команды printf, а затем cat файла.

Тестирование:

$ find -type f -exec bash -c 'grep -q "10\.17\.1\|130\.236\.189" "$1" && printf "\n>>> $1\n" && cat "$1"' sh {} \; >>> ./somefile.txt 10.17.1 some other text >>> ./somefile2.txt another file, 130.236.189 some other text
0
ответ дан 24 July 2018 в 20:30

Я думаю, вы могли бы избежать head и xargs, используя статус выхода grep в качестве логического предиката в команде find, например

find /etc -type f -exec grep -IFq -e '10.17.1' -e '130.236.189' {} \; -exec cat {} \; -quit

Объяснение grep:

-I игнорировать двоичные файлы (обычно они не хотят быть grepping) -F рассматривать шаблоны как фиксированные строки, а не регулярные выражения (избегает необходимости избегать периодов - за счет невозможности использования оператора regex |) -q немедленно выйдет с нулевым статусом, если найдено какое-либо совпадение

Первый файл, в котором grep находит совпадение, приведет к его для выхода с нулевым статусом, что, в свою очередь, приведет к тому, что find выполнит cat в этом файле. Предполагая, что cat успешна, find будет затем quit, чтобы печаталось только содержимое первого файла соответствия.

2
ответ дан 24 July 2018 в 20:30
  • 1
    могу ли я знать, почему вы использовали фигурные скобки {}? – NSH 16 April 2017 в 17:03
  • 2
    @NSH «Строка« {} »заменяется на текущее имя файла, которое обрабатывается везде, где оно встречается в аргументах команды« - см. Раздел -exec в man find – steeldriver 16 April 2017 в 17:55

Я хотел бы пойти с этим:

grep -lRE '10.17.1|130.236.189' /etc/ | head -1 | xargs cat grep используется с -R для поиска /etc рекурсивно при использовании -E для использования расширенных функций grep. Переключатель -l с grep используется для печати только имен файлов вместо содержимого. Затем подключите его к xargs, а xargs загрузите имя файла в качестве параметра tor cat. После того, как все кошки распечатают его.

Если вам нужно использовать find:

find /etc/ 2> /dev/null | xargs grep -lE '10.17.1|130.236.189' 2> /dev/null | head -1 | xargs cat

Я использовал 2> /dev/null, чтобы игнорировать ошибки разрешений, когда я обычный пользователь. Если вы используете sudo, нет необходимости их использовать;)

2
ответ дан 31 July 2018 в 23:32
  • 1
    Я не думаю, что здесь нужен stdbuf, труба прекратится, как только head все равно прочитает свою первую строку. – Byte Commander 15 April 2017 в 23:12
  • 2
    @ByteCommander, да, вы правы, обновлены и спасибо;) – Ravexina 15 April 2017 в 23:13
  • 3
    Синоним: cat "$(grep -lRE '10.17.1|130.236.189' /etc/ | head -1)" – wjandrea 15 April 2017 в 23:21
  • 4
    @ Ravexina Я думаю, что предыдущая версия команды, которая включала find, была лучше. – NSH 15 April 2017 в 23:31
  • 5
    Не забывайте избегать периодов, например. 130\.236\.189, иначе они будут интерпретироваться как специальные символы регулярных выражений (которые соответствуют любому одиночному символу, а не только буквалу .) – steeldriver 16 April 2017 в 17:58

вот что я сделаю:

$ find -type f -exec bash -c 'grep -q "10\.17\.1\|130\.236\.189" "$1" && printf "\n>>> $1\n" && cat "$1"' sh {} \;

это работает в основном вот так:

мы даем find ручки установочные файлы ( -type f) и для каждого из них выполнение команды, используя -exec ... {}\; флаг, что конкретная команда будет в форме bash -c 'command1;command2' arg1 arg2 каждого найденного файла передается в качестве аргумента bash -c и в команду себе он судил как нажать [F8] переменная [F9] и будет спокойно проверить файл на базовые регулярные выражения 10\.17\.1\|130\.236\.189 и выход с 0, если текст не найден или 1, если не нашли. при успешном поиске текста мы печатаем Имя файла, используя команду printf, а затем cat файл.

тест:

$ find -type f -exec bash -c 'grep -q "10\.17\.1\|130\.236\.189" "$1" && printf "\n>>> $1\n" && cat "$1"' sh {} \; >>> ./somefile.txt 10.17.1 some other text >>> ./somefile2.txt another file, 130.236.189 some other text
0
ответ дан 31 July 2018 в 23:32

Я думаю, вы могли бы избежать head и xargs, используя статус выхода grep в качестве логического предиката в команде find, например

find /etc -type f -exec grep -IFq -e '10.17.1' -e '130.236.189' {} \; -exec cat {} \; -quit

Объяснение grep:

-I игнорировать двоичные файлы (обычно они не хотят быть grepping) -F рассматривать шаблоны как фиксированные строки, а не регулярные выражения (избегает необходимости избегать периодов - за счет невозможности использования оператора regex |) -q немедленно выйдет с нулевым статусом, если найдено какое-либо совпадение

Первый файл, в котором grep находит совпадение, приведет к его для выхода с нулевым статусом, что, в свою очередь, приведет к тому, что find выполнит cat в этом файле. Предполагая, что cat успешна, find будет затем quit, чтобы печаталось только содержимое первого файла соответствия.

2
ответ дан 31 July 2018 в 23:32
  • 1
    могу ли я знать, почему вы использовали фигурные скобки {}? – NSH 16 April 2017 в 17:03
  • 2
    @NSH «Строка« {} »заменяется на текущее имя файла, которое обрабатывается везде, где оно встречается в аргументах команды« - см. Раздел -exec в man find – steeldriver 16 April 2017 в 17:55

Другие вопросы по тегам:

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