Сценарии Python отличаются от сценариев Perl и PHP, поскольку операторы здесь разделяются пробелами, а не точками с запятой или фигурными скобками. Символы табуляции также важны. Наш первый сценарий Python, подобно нашим более ранним примерам на других языках, ищет файл пароля и печатает каждую строку, содержащую подходящий текст:

#!/usr/bin/python import re. sys pattern = "(?i)" + sys.argv[l] file = open("/etc/passwd") for line in file: if re.search(pattern, line): print line

Python имеет пространства имен (как и Perl) для функций групп, и поэтому многим функциям в этом сценарии предшествуют последовательности символов sys. и re.. Это позволяет несколько лучше, модульно, преподносить части кода. Выражение " (?i)" в третьей строке делает соответствие нечувствительным к регистру, подобно /i в Perl.
Следующий шаг цикла, в котором строки ввода разбиваются на поля, включает прямое продолжение предыдущего:

#!/usr/bin/python import re, sys pattern "(?i)" + sys.argv[l] file = open("/etc/passwd") for line in file: fields = line.splitC':") if re.search(pattern. fields[4]): print line

Python имеет эквивалент функции Perl getpwent, позволяющий ограничить поиск полями, содержащими имена. Сохраните следующий сценарий как fi nduser. ру:

#!/usr/bin/python import re, sys, pwd pattern = "(?i)" + sys.argv[l] for line in pwd.getpwalK ): if re.search(pattern, 1 ine.pw_gecos): print line

Теперь посмотрим, как это работает: admin@serverl:$ ./finduser.ру alf
Cadedarc'. 'x'. 501, 501. 'Alfredo de Dare', '/home/adedarc', '/bin/bash')
В данном сценарии напечатанная нами строка была скорее списком Python, чем последовательностью символов, и это было хорошо видно. Чтобы напечатать строку в ее оригинальном формате, используйте такой код:

#!/usr/bin/python import re. sys, pwd pattern = "(?i)" + sys.argv[l] for line in pwd.getpwalK ): if re.searchtpattern 1ine.pw_gecos): print ":".join(["?s" % v for v in line])

Последняя строка должна превратить каждое поле в последовательность символов (pw_uid и pw_gid являются целыми числами) прежде, чем присоединить их к длинной, разделенной двоеточиями, последовательности символов. В то время как Perl и РНР позволяют вам считать переменную последовательностью символов или числом, Python строже.
Последний шаг — ограничение поиска учетными записями с uid > 500:

#! /usr/bi n/python import re. sys, pwd pattern = "(?i)" + sys.argv[l] for line in pwd.getpwalK ): if line.pw_uid > 500 and re.search(pattern line.pw_gecos): print ":".join(["8s" % v for v in line])