Используя find
и dirname
, чтобы найти все файлы с именем minecraft
в текущем каталоге, (отрегулируйте место поиска в соответствии с ).
find. -type f -name minecraft | xargs -L 1 dirname
Для поиска файлов с разрешениями на выполнение вы можете использовать параметр -perm
для поиска (настроить значение в соответствии с вашими критериями поиска):
find. -type f -perm +0111 -name minecraft | xargs -L 1 dirname
Это должно напечатать путь к каталогу относительно места поиска .
Если вы хотите выполнить поиск по всей системе, просто передайте /
в качестве первого аргумента для поиска.
Использование GNU grep:
$ grep -P '^(?!(?:.*#){2}).*#' infile
xxxxxxxxx#aaa
xxxxxxxxxxxxxxxx#
xxx#x
$
Параметр -P означает использование регулярных выражений PCRE (Perl Compatible Regular Expressions ). См. https://www.pcre.org. PCRE являются расширениями расширенных регулярных выражений ERE (), первоначально введенных в Perl, которые позже были приняты многими командами, утилитами, приложениями и языками программирования.
Если GNU grep недоступен на вашей платформе, вы можете установить pcregrep
, который является частью пакета pcre-tools
, доступного на многих платформах.
Обобщенная форма этого конкретного регулярного выражения PCRE::
^(?!(?:.*PATTERN){2}).*PATTERN
где PATTERN
означает шаблон, который должен встречаться один раз и только один раз в строке grepped. В нашем случае шаблон #
.
^
-начало строки (?!(?:.*PATTERN){2})
-отрицательный просмотр вперед, который не соответствует совпадению, которое находится непосредственно справа от текущего местоположения, т. е. начала строки, если есть два({2}
)последовательных вхождения :.*
-0 или более символов PATTERN
-узор .*
-0 или более символов PATTERN
-узор При двух вызовахgrep
:выберите любую строку, в которой есть хотя бы один #
, затем удалите те, в которых есть хотя бы два:
grep '#' filename | grep -v '#.*#'
С помощью awk
мы можем использовать функцию gsub в блоке условий для выбора наших строк:
$ awk 'gsub(/#/, "#") == 1' file
$ awk '/#/ && ! /#.*#/' file
$ sed -ne 's/#/&/2;t' -e '//p' file
#
не будут напечатаны из-за команды t
и опции -n
, заданной для sed. С помощью perl
мы можем подсчитать количество #
символов в скалярном контексте, чтобы обнаружить наши строки:
$ perl -ne 'print if tr/#/#/ == 1' file
команда
awk '{print $0,gsub("#",$1)}' filename |awk '$NF == "1"'
выход
xxxxxxxxx#aaa 1
xxxxxxxxxxxxxxxx# 1
xxx#x 1
питон
#!/usr/bin/python
import re
k=open('filename','r')
for i in k:
if i.count("#") == 1:
print i.strip()
выход
xxxxxxxxx#aaa
xxxxxxxxxxxxxxxx#
xxx#x