http://www.linux.org.ru/forum/admin/4493387



В связи с тотальной прослушкой интернет-каналов и прозрачностью коммерческих интернет-компаний перед государственными органами сейчас остро встал вопрос о мерах противодействия. Для пользователя самый эффективный вариант — использование криптографических инструментов и децентрализованных сервисов.
Ниже предоставлен список доступных способов анонимизации и защиты своих прав. Использовать на свой страх и риск.
раскрыть тему
AnoNet — децентрализованная сеть между друзьями с использованием VPN и программных BGP-маршрутизаторов.
http://wiki.ucis.nl/Anonet

Bitcoin — криптовалюта.
https://bitcoin.org/en/

BitPhone — мобильное коммуникационное устройство, работающее на базе децентрализованной сети в стиле Bitcoin.
http://www.gullicksonlaboratories.com/projects/bitpho..

BitMessage — коммуникационный протокол P2P, используемый для обмена зашифрованными сообщениями от одного пользователя ко многим подписчикам.
https://bitmessage.org/wiki/Main_Page

Commotion Wireless open source коммуникационный инструмент, работающий на мобильных телефонах, компьютерах и других беспроводных устройствах для создания децентрализованных mesh-сетей.
http://oti.newamerica.net/commotion_wireless_0

Cryptosphere — распределенное зашифрованное облачное хранилище на базе модели данных Git.
https://github.com/cryptosphere/cryptosphere

Drogulus (WIP) — программируемое P2P-хранилище данных с поддержкой криптографии.
http://drogul.us/

Сеть eDonkey — файлообменная децентрализованная сеть для обмена большими файлами.
http://en.wikipedia.org/wiki/EDonkey_network

Freenet — свободное программное обеспечения для анонимного обмена файлами, публикации сайтов (доступны только через Freenet), чатов и форумов.
https://freenetproject.org/

Freifunk — некоммерческая инициатива по созданию свободной децентрализованной mesh-сети. Прошивки Freifunk основаны на OpenWRT и OLSR или B.A.T.M.A.N.
http://wiki.freifunk.net/Kategorie:English

GNUnet — фреймворк для безопасных peer-to-peer коммуникаций без использования центральных или промежуточных серверов.
https://gnunet.org/

Grimwire — браузерное приложение, которое использует Web Workers для изоляции процессов и WebRTC для peer-to-peer коммуникаций.
http://blog.grimwire.com/#2013-04-04-grimwire.md

Guifi — европейская (преимущественно, испанская) большая mesh-сеть с более чем 22000 активными узлами WiFi и 25 км оптоволокна.
http://guifi.net/

I2P — анонимизирующая сеть, использующая несколько уровней шифрования.
https://geti2p.net/en/

Kademlia — распределенная хэш-таблица для P2P-сетей.
http://en.wikipedia.org/wiki/Kademlia

NameCoin — распределенная система DNS на технологии Bitcoin.
http://namecoin.info/

Nightweb — экспериментальное приложение для Android или ПК, которое позволяет публиковать контент и общаться через BitTorrent поверх I2P.
https://nightweb.net/

LibreVPN — виртуальная mesh-сеть с конфигурационными скриптами, позволяющими поднять собственный mesh-VPN.
http://librevpn.org.ar/

OpenNIC Project — открытый и демократичный альтернативный DNS-провайдер.
http://www.opennicproject.org/

Osiris — ПО для децентрализованного портала, управляемого и работающего по P2P.
http://www.osiris-sps.org/

PeerCDN — автоматически раздает статичные ресурсы на сайте (изображения, видео, файлы) через P2P-сеть, составленную из посетителей, который в данный момент находятся на сайте.
https://peercdn.com/

PeerCoin/PPCoin — первая криптовалюта, основанная на реализации одновременно систем proof-of-stake и proof-of-work.
http://ppcoin.org/

PeerServer — пиринговая клиент-серверная технология, с использованием WebRTC, где ваш браузер работает как сервер для других браузеров через пиринговые P2P-каналы WebRTC.
http://www.peer-server.com/

Phantom — система децентрализованной интернет-анонимности.
https://code.google.com/p/phantom/

Project Byzantium — Linux-дистрибутив с поддержкой беспроводных mesh-сетей, который обеспечит связь в случае стихийного бедствия или аварии интернет-провайдера.
http://project-byzantium.org/

Project Meshnet ставит целью создание устойчивого децентрализованного альтернативного интернета.
https://projectmeshnet.org/

Quick mesh project — прошивка на базе OpenWRT для создания mesh-сетей.
http://qmp.cat/Home

RetroShare — open-source, децентрализованная коммуникационная платформа для чатов и обмена файлами.
http://retroshare.sourceforge.net/

Serval Project позволяет осуществлять звонки между мобильными телефонами без использования базовых станций.
http://www.servalproject.org/

Syndie — немецкая open-source система для поддержки распределенных форумов.
http://syndie.i2p2.de/

Tahoe-LAFS — свободная распределенная файловая система с дублированием информации.
https://tahoe-lafs.or/

Tavern — распределенная, анонимная невзламываемая сеть, защищенная от любого пользователя извне.
https://tavern.com/

Telehash — новый криптографический протокол на базе JSON, позволяющий быстро создавать защищенные P2P-приложения.
http://telehash.org/

FNF — организация Free Network Foundation для информационной поддержки в создании локальных беспроводных сетей.
https://thefnf.org/

Tonika — распределенная социальная сеть, в которой коммуникации осуществляются напрямую между друзьями.
http://pdos.csail.mit.edu/~petar/5ttt.org/

Tor — многоступенчатая сеть анонимайзеров, браузер.
https://www.torproject.org/

Tox — проект, ставящий целью создать P2P-альтернативу Skype.
https://github.com/irungentoo/toxcore/blob/master/doc..

Tribler — проект по созданию интернета, свободного от цензуры, развивается уже восемь лет, создано экспериментальное приложение для Android.
https://github.com/Tribler/tribler/wiki

Unhosted — бессерверные веб-приложения, которые исполняются в браузере клиента.
https://unhosted.org/

Vole — социальная сеть в браузере, без центрального сервера, использует Bittorrent, Go и Ember.js, а также Bittorrent Sync.
http://vole.cc/

ZeroTier One — open source приложение для создания огромных распределенных Ethernet-сетей. Используется end-to-end шифрование для всего трафика. Есть коммерческая и бесплатная версия.
https://www.zerotier.com/

http://vpnazure.net/en/
Строим туннели. Разбираемся с новинками VPN

Как обойти блокировку Telegram в России с помощью протокола SOCKS5
http://spys.one/proxys/

https://t.me/TgVPNbot?start=promo_tgproxy

Telegram выпустил официальный MTProto Proxy Server
https://hub.docker.com/r/telegrammessenger/proxy/
https://github.com/TelegramMessenger/MTProxy

Помните: используя критографические (шифровальные) системы, вы не нарушаете закон — вы защищаете своё право на анонимность.

https://ssd.eff.org/ru/
https://privacytools.ru/
http://www.cypherpunks.ru/Links.html#Links
https://www.cryptoparty.in/learn/handbook
https://ru.thatoneprivacysite.net/

Почта работающая с tor browser
https://www.xmail.net/teapot/webxmail/

просмотр сайтов как в мобильнике
http://google.com/gwt/n?u=ubuntu.ru
https://googleweblight.com/?lite_url=http://flibusta.is

15 лучших и бесплатных инструментов компьютерного криминалиста
70+ бесплатных инструментов для компьютерной криминалистики (форензики)


https://vk.com/wall-38219274_51991




консоль python в роли командной строки часть 1

заглянуть

Работа с WWW



сервер
запускает HTTP для всех локальных интерфейсов на порту 8080
python -m SimpleHTTPServer 8080 # python2
python3 -m http.server 8080

python3 -m http.server 8080 --cgi # запустить в папке, где находится каталог cgi-bin
# со сценарием cgi

открыть в браузере адреса
http://0.0.0.0:8080/ или http://localhost:8080/ или http://127.0.0.1:8080/

python -m SimpleHTTPServer # без указания порта запустит сервер на порту 8000
python3 -m http.server

запускает сервер SMTP на порту 1025
python -m smtpd -n -c DebuggingServer localhost:1025
запустить сервер SMTP на стандартном порту 25
sudo python -m smtpd -n -c DebuggingServer localhost:25

http://rus-linux.net/nlib.php?name=/MyLDP/consol/oneliners.html

работа с http

import webbrowser
webbrowser.open('http://www.habrahabr.ru/') # открыть ссылку в браузере
webbrowser.open(u'file://home/user/mysite.html')
webbrowser.open(u'mailto:foo@bar.com?subject=Feedback%20message') # открыть почтовый клиент создать письмо
http://habrahabr.ru/post/62383/
если нет модуля webbrowser то
apt-get install python-pip python3-pip
pip install webbrowser
http://rtfm.co.ua/python-utilita-pip-pypi/
http://asvetlov.blogspot.ru/2014/05/pip.html
import urllib2
urllib2.urlopen('http://www.example.com/').read()
# скачать файл по протоколу http

работа с ftp

from ftplib import FTP
f = FTP('ftp.gnu.org')
f.login('','') # f.login('login', 'password')
for x in f.nlst()[:9]: print(x)
L = []
f.dir(L.append)
for x in L[:15]: print(x)
f.nlst()
f.dir()
f.nlst()[17]
remotefiles=f.nlst()[17]
localdir = '/home/user/path/'
localpath = os.path.join(localdir, remotefiles)
localfile = open(localpath, 'wb')
f.retrbinary('RETR ' + remotefiles, localfile.write)
localfile.close()
import os
os.listdir()

pypi install wget
import wget
wget.download("http://www.python.org/")


Экранирование тегов html



>>> import cgi
>>> cgi.escape('a < b > c & d "spam"', 1)
'a &lt; b &gt; c &amp; d &quot;spam&quot;'
>>> s = cgi.escape("1<2 <b>hello</b>")
>>> s
'1&lt;2 &lt;b&gt;hello&lt;/b&gt;'
>>>
>>> import html
>>> html.escape('a < b > c & d "spam"', 1)
'a &lt; b &gt; c &amp; d &quot;spam&quot;'
>>> s = html.escape("1<2 <b>hello</b>")
>>> s
'1&lt;2 &lt;b&gt;hello&lt;/b&gt;'

>>> import cgi, html.parser
>>> s = cgi.escape("1<2 <b>hello</b>")
>>> s
'1&lt;2 &lt;b&gt;hello&lt;/b&gt;'
>>>
>>> html.parser.HTMLParser().unescape(s)
'1<2 <b>hello</b>'
>>>
>>> import html, html.parser
>>> s = html.escape("1<2 <b>hello</b>")
>>> s
'1&lt;2 &lt;b&gt;hello&lt;/b&gt;'
>>> html.parser.HTMLParser().unescape(s)
'1<2 <b>hello</b>'

>>> import urllib.parse
>>> urllib.parse.quote("a & b #! c")
'a%20%26%20b%20%23%21%20c'
>>> urllib.parse.quote_plus("C:\stuff\spam.txt")
'C%3A%5Cstuff%5Cspam.txt'
>>> x = urllib.parse.quote_plus("a & b #! c")
>>> x
'a+%26+b+%23%21+c'
>>> urllib.parse.unquote_plus(x)
'a & b #! c'


Экранирование адресов URL



>>> import urllib.parse
>>> b='http://lurkmore.to/Монти_Пайтон'
>>> urllib.parse.quote(b)
'http%3A//lurkmore.to/%D0%9C%D0%BE%D0%BD%D1%82%D0%B8_%D0%9F%D0%B0%D0%B9%D1%82%D0%BE%D0%BD'
>>> d=urllib.parse.quote(b)
>>> d
'http%3A//lurkmore.to/%D0%9C%D0%BE%D0%BD%D1%82%D0%B8_%D0%9F%D0%B0%D0%B9%D1%82%D0%BE%D0%BD'
>>> urllib.parse.unquote(d)
'http://lurkmore.to/Монти_Пайтон'


Экранирование адресов URL с якорями
python3
>>>
>>> import urllib.parse
>>> s='http://lurkmore.to/%D0%9A%D0%BE%D0%BF%D0%B8%D0%BF%D0%B0%D1%81%D1%82%D0%B0:Python#.D0.9E.D1.80.D0.B8.D0.B3.D0.B8.D0.BD.D0.B0.D0.BB'
>>> (a,b)=s.split('#')
>>> a
'http://lurkmore.to/%D0%9A%D0%BE%D0%BF%D0%B8%D0%BF%D0%B0%D1%81%D1%82%D0%B0:Python'
>>> b
'.D0.9E.D1.80.D0.B8.D0.B3.D0.B8.D0.BD.D0.B0.D0.BB' 
>>> b=b.replace('.','%')
>>> b
'%D0%9E%D1%80%D0%B8%D0%B3%D0%B8%D0%BD%D0%B0%D0%BB' 
>>> j=a+'#'+b
>>> j
'http://lurkmore.to/%D0%9A%D0%BE%D0%BF%D0%B8%D0%BF%D0%B0%D1%81%D1%82%D0%B0:Python#%D0%9E%D1%80%D0%B8%D0%B3%D0%B8%D0%BD%D0%B0%D0%BB'
>>> 
>>> l=urllib.parse.unquote(j)
>>> l
'http://lurkmore.to/Копипаста:Python#Оригинал'



Почтовые вложения и ссылки base64



>>> import base64
>>> base64.b64decode('aHR0cDovLzR1ZnJlZS50ay9tZWRpYTcyMzY0Ni9mdWVuZi8wMzYubXAz')
b'http://4ufree.tk/media723646/fuenf/036.mp3' 



Шифрование



a ^ b ^ b == a

>>> 1925^99
2022
>>> 2022^99
1925

шифрование искажение символов (простое)
sys.stderr.write('using simple\n')
adder = 1
def do_encode(pswd):
    pswd = 'vs' + pswd + '48'
    res = ''
    for char in pswd:
        res += chr(ord(char) + adder) # увеличить каждый код ASCII
    return str(res)
def do_decode(pswd):
    pswd = pswd[2:-2]
    res = ''
    for char in pswd:
        res += chr(ord(char) - adder)
    return res

http://pythonlearn.ru/без-рубрики/shifrovanie-strok-s-pomoshhyu-modulya-hashlib-python/
>>> import hashlib
>>> h = hashlib.sha1(b"password")
>>> h = hashlib.sha1()
>>> h.update(b"password")
>>> h = hashlib.sha1(b"password")
>>> h.digest()
'[\xaaa\xe4\xc9\xb9??\x06\x82%\x0bl\xf83\x1b~\xe6\x8f\xd8'
>>> h.hexdigest()
'5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8'

>>> import hashlib
>>> h = hashlib.md5(b"password")
>>> p = h.hexdigest()
>>> p
'5f4dcc3b5aa765d61d8327deb882cf99'
>>> p    # Пароль, сохраненный в базе
'5f4dcc3b5aa765d61d8327deb882cf99'
>>> h2 = hashlib.md5(b"password")   # Пароль, введенный пользователем
>>> if p == h2.hexdigest(): print("Пароль правильный")
... 
Пароль правильный

http://ivinside.blogspot.ru/2012/04/aes-pycrypto.html
from Crypto.Cipher import AES
import base64
import os
# размер блока шифрования
BLOCK_SIZE = 32
# символ, использующийся для дополнения шифруемых данных
# до размера, кратного 32 байтам
PADDING = '{'
# функция дополнения
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
# функции шифрования и расшифрования
# результат дополнительно обертывается в base64
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
# генерируем ключ
secret = os.urandom(BLOCK_SIZE)
# создаем объект
cipher = AES.new(secret)
# шифруем строку
encoded = EncodeAES(cipher, 'password')
print 'Encrypted string:', encoded
# расшифровываем строку
decoded = DecodeAES(cipher, encoded)
print 'Decrypted string:', decoded


Простое шифрование с openssl
http://www.py-my.ru/post/554f1ca43ad2ff04ff2d41ba
Шифруем:
openssl aes-256-cbc -in input_file -out output_file
Дешифруем:
openssl aes-256-cbc -d -in input_file -out output_file
При выполнении запрашивается пароль.


Изображения



мануал

Pillow
$ pip install Pillow
from PIL import Image, ImageFilter
# Считываем изображение
im = Image.open( 'image.jpg' )
# Показываем изображение
im.show()
# Применяем фильтр к изображению
im_sharp = im.filter( ImageFilter.SHARPEN )
# Сохраняем отфильтрованное изображение в новый файл
im_sharp.save( 'image_sharpened.jpg', 'JPEG' )
# Разбиваем изображение на соответствующие bands (то есть на красный, зеленый # и синий для RGB) r,g,b = im_sharp.split()
# Просматриваем данные EXIF, встроенные в изображение
exif_data = im._getexif() exif_data

Как легко вырезать фон на изображении с помощью Python
# pip install rembg pillow
from rembg import remove
from PIL import Image
input_path = "in.png"
output_path = "out.png"
input = Image.open(input_path)
output = remove(input)
output.save(output_path)

python rembg - изменить цвет фона
это даст вам вывод с полностью красным фоном.
removeim = remove(im,bgcolor=[255,0,0,255])
измените bgcolor=[255,0,0,255] на bgcolor=[0,255,0,255], чтобы получить полностью зеленый фон.


cv2
распознавание лиц в реальном времени, видео в реальном времени
https://github.com/Itseez/opencv/blob/master/samples/python/facedetect.py

http://tinyurl.com/opencv3-py-tutorial
http://tinyurl.com/opencv3-py3-ubuntu
http://tinyurl.com/opencv3-py3-anaconda

from cv2 import * import numpy as np
# Считываем изображение img = cv2.imread('testimg.jpg')
# Показываем изображение
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# Применяем к изображению фильтр Grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Сохраняем отфильтрованное изображение в новый файл
cv2.imwrite('graytest.jpg',gray)

Scikit-Image
http://scikit-image.org/docs/dev/auto_examples/


Разные модули



модуль Wget
https://pypi.python.org/pypi/wget
>>> import wget
>>> wget.download("http://www.python.org/")
или
python -m wget [options]

модуль xonsh
http://xon.sh/
Xonsh is a Python-ish, BASHwards-looking shell language and command prompt.


модуль sh
http://amoffat.github.io/sh/
>>> from sh import tar
>>> tar("cvf", "/tmp/test.tar", "/my/home/directory/")

>>> from sh import ls
>>> print(ls("/"))

>>> from sh import ifconfig
>>> print(ifconfig("wlan0"))

>>> from sh import find
>>> find("/tmp")

psutil
https://github.com/giampaolo/psutil
>>> import psutil
>>> psutil.cpu_times()
>>> psutil.virtual_memory()
>>> psutil.swap_memory()
>>> psutil.disk_partitions()
>>> psutil.disk_usage('/')
>>> psutil.net_io_counters(pernic=True)
>>> psutil.net_connections()
>>> psutil.net_if_addrs()
>>> psutil.net_if_stats()
>>> psutil.users()
....................

PyAutoGui модуль управления компьютером
pip install pyautogui

import pyautogui as pg

# Получение позиции мыши и вывод в консоль
print(pg.position())

# Передвижение мыши
pg.move(50, 50, duration=0.5)
pg.moveTo(150, 200, 0.5) # Передвигаем к точке относительно экрана

# Нажатие мышкой по определенной точке
pg.click(769, 101)
pg.doubleclick(769, 101) # двойное нажатие
pg.rightclick(769, 101) # нажатие правой кнопкной мыши
pg.leftclick(769, 101) # нажатие левой кнопкной мыши

# Ввод текста
pg.typewrite("itproger.com")
# Выполнения нажатия на клавишу
pg.typewrite(["enter"])

# Выполнения нажатия на сочетание клавиш
pg.hotkey("winleft")
pg.hotkey("winleft", "up")
pg.hotkey("ctrl", "t")

# Вызов различных всплывающих окон
pg.alert("Окно с информацией", "Название окна", button="Текст на кнопке")
age = pg.prompt("Укажите возраст: ", "Название окна")
print(age)
pg.confirm("Вам больше 18?", "Название окна", ("Да, точно", "Нет"))
pg.password("Введите пароль", "Название окна")

# Создание скриншота
pg.screenshot("yourPic.png")

# Мини программа
website = pg.prompt("Введите название сайта:", "Веб сайт", "https://")
pg.click(769, 101)
pg.typewrite(website)
pg.typewrite(["enter"])
pg.screenshot("yourPic.png")



Отладка в python через консоль



href="http://www.py-my.ru/post/4e37737b1d41c8451b000002

Запуск скрипта в отладчике

$ python -m pdb script.py

Либо можно прописать запуск отладчика в самом скрипте, для этого нужно добавить код

import pdb
pdb.set_trace()
Команды
help       Список команд
list	   Отображение листинга, отображает точки останова - "B" в начале строки
list s,e   Часть листинга: s - начальная строка, e - конечная строка
next	   Выполнить следующую команду текущего метода
step	   Выполнить следующую команду со входом внутрь методов
return	   Выполнить текущий метод до конца
until	   Выполнить до конца метода/цикла
args	   Вывести список локальных переменных
locals()   Отображение текущей области видимости (команда не отладчика)
quit	   Выйти из отладчика
where	   Определить текущее местоположение
up	   Перемещение по стеку вверх
down	   Перемещение по стеку вниз
p value	   Вывести на экран значение (print)
pp value   Более красивый вывод на экран
!command   Выполнить произвольную команду
jump       Перейти на строку (выполнить до строки)
run [ 'script.py', 'a', 'b', 'c']	Перезапуск скрипта с параметрами
alias pl pp %1	Создать алиас команды, %1 - входящий параметр
unalias pl	Удаление алиаса

Точки останова
break	        Просмотр установленных т.о. и их номеров
disable 1	Отключить т.о. по номеру
enable 1	Включить т.о. по номеру
break 15	Установить т.о. на указанной строке
break foo	Установить т.о. на методе
break ../script2.py:15	Установить т.о. в другом файле
break 15, i>7	Установить т.о. с условием
condition 1 i>0	Назначить условие на существующую т.о.
tbreak 15	Временная т.о., удаляется при достижении
continue	Продолжить выполнение скрипта
clear	        Удалить все т.о.
clear 1	        Удалить т.о. под номером 1
ignore 1 10	Установка счетчика "не срабатывания", для т.о. 1, пропустить 10 остановок
commands 1
...
end	        Создать сценарий для т.о. 1

Настройки по умолчанию можно сохранить в файле ~/.pdbrc и ./.pdbrc (последний переопределяет настройки первого)

Кратко в деталях
https://unixhow.com/3849/kak-zapustit-python-skript-v-rezhime-otladki
Вам нужно запустить ваш скрипт на пайтоне, используя модель pdb (Python Debug):

python -m pdb merge_lists.py

Увидите нечто такое:

python -m pdb merge_lists.py
> /Users/and3001/Documents/Personal/Coding/Python/merge_lists.py(3)()
-> my_list     = [3, 4, 6, 10, 11, 15]
(Pdb)

Что бы продолжить работу, нажмите n (next). Так пошагово разберете все шаги вашего скрипта.

(Pdb) n
> /Users/and3001/Documents/Personal/Coding/Python/merge_lists.py(4)()
-> alices_list = [1, 5, 8, 12, 14, 19]
(Pdb)

Что бы выйти, нажмите q


Разное



выполнение строки
python3 -c "print(bin(255))"
echo "print(bin(255))" |python3

документация по модулям
pydoc -p 8080
http://localhost:8080/

вывод AST и cкомпилированного кода в веб-интерфейсе
$ pip install instaviz
vi test.py


python3 test.py

printf
https://stackoverflow.com/questions/63627692/making-the-printf-function-of-c-into-python
https://stackoverflow.com/questions/19457227/how-to-print-like-printf-in-python3
импорт из Си

import ctypes
libc = ctypes.cdll.LoadLibrary("libc.so.6")
printf = libc.printf
printf(b'num: %d, txt: %s\n', 42, b'Hello World') # b' - обязательно

импорт из sys

import sys
def printf(format, *args):
    sys.stdout.write(format % args)

printf('num: %d, txt: %s\n', 42, 'Hello World')

сделать функцию

def printf(text, *args):
    print(text % args)

printf('num: %d, txt: %s\n', 42, 'Hello World')


привести код в порядок
python3 -m pip install flake8
flake8 myscript.py # проверить как и где именно нарушается стиль

python3 -m pip install black
black --check myscript.py # проверить будет ли black изменять файл
black --diff myscript.py # показать изменения
black myscript.py # отформатировать

показать текущее время с датой
>>> impotr time
>>> time.ctime(time.time())
>>> time.asctime()

Uuid

>>> import uuid
>>> print uuid.uuid4()
# e7bafa3d-274e-4b0a-b9cc-d898957b4b61

Progressbar


узнать все зарезервированные слова
>>> import keyword
>>> keyword.kwlist

li=[]
if not li: print "empty" # проверить список на пустоту

"12345".zfill(10) # дополнить строку нулями

hasattr(a,'attributename') # узнать имеет ли объект атрибут в Python?

сделать отсортированный список по значениям из cловаря

newlist = sorted(list_to_be_sorted, key=lambda k: k['name'])

разбить список на части одинакового размера
def chunks(l, n):
    for i in xrange(0, len(l), n):
        yield l[i:i+n]


выполнить код в зависимости от версии интерпретатора
import sys
import __future__

if sys.version_info[0] == 2:
    # Python 2 code
else:
    # Python 3 code

или
if sys.version[:1] == '2':
    # Python 2 code
else:
    # Python 3 code


найти файл либы
аналог
ldconfig -p |grep udev

import ctypes.util
ctypes.util.find_library("udev")

в сборке с musl не работает, поэтому патч
https://git.alpinelinux.org/aports/tree/main/python3/musl-find_library.patch

Поймать несколько исключений в одной строке
except (Exception1, Exception2) as e: pass

http://www.user.su/Основы_Python
http://jenyay.net/Programming/Python

легендарный FuzzBuzz
https://megamozg.ru/post/23556/
https://megamozg.ru/post/10308/
В поисках компактного FizzBuzz на Python
a = list(range(1, 101))
for i in a:
    if i%15 == 0: print(i, 'FuzzBuzz')
    if i%3 == 0 and i%15!=0: print(i, 'Fuzz')
    if i%5 == 0 and i%15!=0: print(i, 'Buzz')

Начнём со стандартного, классического решения:
for i in range(1, 101):
    if i%3==0 and i%5==0:
        print('FizzBuzz')
    elif i%3==0:
            print('Fizz')
    elif i%5==0:
            print('Buzz')
    else:
        print(i)

Укладываем стандартное решение в стандартный однострочник
print('\n'.join('FizzBuzz' if i%3==0 and i%5==0 else 'Fizz' if i%3==0 else 'Buzz' if i%5==0 else str(i) for i in range(1, 101)))

Избавляемся от Join, приручаем Print
[print('FizzBuzz' if i%3==0 and i%5==0 else 'Fizz' if i%3==0 else 'Buzz' if i%5==0 else i) for i in range(1, 101)]

Добавляем срез, укрощаем if else
[print('FizzBuzz'[4 if i%3 else 0:4 if i%5 else 8] or i) for i in range(1, 101)]

Оптимизируем срез, избавляемся от if else
[print('FizzBuzz'[i*i%3*4:8--i**4%5] or i) for i in range(1, 101)]

Сократили неплохо. Но, похоже с этой вариацией дальше не продвинуться. Пробуем иной вариант.
Заменяем срез конкатенацией, вертаем оператор modulo
[print('Fizz'*(i%3==0)+'Buzz'*(i%5==0) or i) for i in range(1, 101)]

Оптимизируем решение. Выравниваем по длине со срезом
[print((i%3<1)*'Fizz'+(i%5<1)*'Buzz' or i) for i in range(1, 101)]

Уходим в отрыв. Модифицируем окончательный вариант
[print(i%3//2*'Fizz'+i%5//4*'Buzz' or i+1) for i in range(100)]

А если избавиться от списка, будет ещё короче и, возможно, быстрее:
for i in range(100):print(i%3//2*'Fizz'+i%5//4*'Buzz'or i+1)




pyperclip
взято тут
видеоуроки по теме

pip3 install pyperclip




Занимательные фигуры на Python в одну строку
странности
(Link)
>>> type( {} ),type( { () } )
(, )

>>> 1, + 2,
(1, 2)

>>> (1,) + (2,)
(1, 2)

>>> (1,) + 2,
Traceback (most recent call last):
File "<input ... >", line 1, in 
(1,) + 2

>>> __ = [1,2]; _= range(5);[_ for _ in _ if _ not in __]
[0, 3, 4]

>>> __
[1, 2]



Кристиан Майер «Однострочники Python» 2022
https://github.com/finxter/PythonOneLiners



консоль python в роли командной строки часть 2

заглянуть

Модули



Шоу Энтони «Внутри CPython» 2023

узнать конфигурацию сборки python
python3 -m sysconfig

документация по модулям
pydoc -p 8080
http://localhost:8080/

импорт из github.com
https://github.com/nvbn/import_from_github_com
pip install import_from_github_com

чтобы загрузить модуль нужно его импортировать: import модуль, например
import os
удалить модуль (или переменную)
del os

узнать все модули:
pydoc3 -b
pydoc -b

или вбить в консоли python
help('modules')
pip freeze

узнать что входит в модуль:
import sys
sys. # нажать на Tab

узнать где расположен файл с модулем
import модуль
print(модуль.__file__)

Встроенные функции Python содержатся в модуле __builtin__(импортировать его для использования функций не нужно):
dir(__builtins__)
__builtins__. # нажать на Tab

В возвращаемом функцией dir() списке не содержится встроенных функций и переменных. Если вы хотите получить их список, то они определены в стандартном модуле builtins
builtins - встроенные модули, у которых отсутствует имя файла
>>> import builtins
>>> dir(builtins)
>>> import pprint, sys
>>> pprint.pprint(sys.modules)
>>> pprint.pprint(sys.path)

sys.path представляет собой список файловых путей, в которых лежат модули
интерпретарор ищет модули вначале в текущем каталоге, а затем в каталогах, указанных в переменной окружения PYTHONPATH

Получаем список переменных внутри функции
>>> print(locals())
>>> print(globals())
Функция locals() возвращает словарь переменных из текущего пространства имён Ключи словаря — названия переменных, а значения — это их значения.
С помощью похожей функции globals() можно получить все переменные конкретного модуля в таком же виде


пути загрузки модулей
import sys
print(sys.path)

автоматический путь к каталогу с модулями
import sys
sys.path.append(f"/usr/lib/python{sys.version_info.major}.{sys.version_info.minor}/mprdaemon")

import platform
print(f'/usr/lib/python{platform.python_version()[:3]}/distutils') # каталог distutils дан для примера
sys.path.append(f'/usr/lib/python{platform.python_version()[:3]}/distutils')

Откуда грузятся модули?
__import__
sys.modules
sys.path
.pth файлы
sys.meta_path
sys.path_hooks
sys.path_import_cache
http://pep8.ru/doc/tutorial-3.1/6.html
http://asvetlov.blogspot.ru/2010/05/2.html

Решение проблем с модулями и пакетами Python

impotr time
time.ctime(time.time()) # показать текущее время с датой
time.asctime()

import os
os.system('команда') # запустит команду, напр. os.system('mc')
os.getcwd() # узнать местонахождение
os.chdir('/home') # переместится в /home
os.listdir('/usr/src') # узнать что находится в /usr/src
print os.path.isfile('fname') # проверить, существует ли файл
os.stat('/home/user/2') # узнать сведения о файле или каталоге /home/user/2
os.path.getsize('/home/user/path/hello.txt') # узнать размер файла
list(os.popen('du -sh /home/user/path')) # узнать размер каталога path
os.mkdir('/home/user/path') # создать каталог /home/user/path
os.makedirs('/home/user/path/1/1/1/1') # Создать каталог и промежуточные каталоги
os.rmdir('/home/user/path') # удалить каталог /home/user/path
os.removedirs('/home/user/path/1/1/1/1') # автоматически удалит все пустые родительские каталоги (~/1/1/1)
os.remove('/home/user/path/hello.txt') # удалит файл hello.txt
os.rename('/home/user/path', '/home/user/tmp/path') # переименует (или перенесёт в существующий каталог) каатог или файл
os.symlink('/home/user/path', '/home/user/22') # создаст символическую ссылку с именем 22
os.system('id') # узнать свой id
os.chown('/home/user/path', uid, gid ) # сменить владельца -uid, группу - gid
uid root - 0, gid root - 0
os.chmod('/home/user/path' 0o100644) # дать права (в восьмеричной системе)

oct(число) # число в восьмеричной системе
hex(число) # в шестнадцатеричной
bin(число) # в двоичной
int(0o1000) # 512 в десятеричной
int(0b1000) # 8
int(0x1000) # 4096

import shutil
shutil.copyfile('/home/user/path/hello.txt', '/home/user/tmp/hel.txt') # cкопирует файл с именем hel.txt, метаданные (права и тд) не копирует
shutil.copy('/home/user/path/hello.txt', '/home/user/tmp/hel.txt') # cкопирует файл с именем hel.txt, копирует метаданные
shutil.copy2('/home/user/path/hello.txt', '/home/user/tmp/hel.txt') # cкопирует файл с именем hel.txt, полное копирование метаданных
shutil.move('/home/user/path', '/home/user/tmp/tmp/tmp') # переместить/переименовать каталог/файл если промежуточных каталогов нет, то создаст оные
shutil.move('/home/user/path/hello.txt', '/home/user/tmp') # перенесёт с тем же именем в каталог tmp
shutil.copytree('/home/user/path', '/home/user/tmp/new') # скопирует каталог path со всем содержимым (дерево каталогов) в tmp с именем new
shutil.rmtree('/home/user/tmp/new') # удалит каталог new со всем содержимым


Управление модулями, pip



wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py

$ pip help # помощь по доступным командам.
$ pip install package_name # установка пакета(ов).
$ pip uninstall package_name # удаление пакета(ов).
$ pip-autoremove package_name # удаление пакета(ов), с установленными зависимостями
$ pip install -U # обновление пакета(ов).
$ pip install --force-reinstall # при обновлении, переустановить пакет, даже если он последней версии.
$ pip list # Смотрим на список установленных (доступных) библиотек
$ pip list -o # узнать, какие библиотеки можно обновить
$ pip show package_name # узнать версию, местонахождение на диске и зависимости.
$ pip search pycp # покажет список всех пакетов, в названии которых есть pycp
$ pip --proxy user:passwd@proxy.server:port # использование с прокси.
$ pip completion --bash >> ~/.bashrc # Автодополнение
http://asvetlov.blogspot.ru/2014/05/pip.html

Как обновить существующие пакеты? (пользоваться осторожно, лучше в virtualenv или pyenv )

$ pip install pip-review
$ pip-review --local --interactive
или
$ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U
$ for i in $(pip list -o | awk 'NR > 2 {print $1}'); do sudo pip install -U $i; done
$ sudo pip install -U $(pip freeze | awk '{split($0, a, "=="); print a[1]}')
$ sudo pip install -U $(pip freeze | cut -d '=' -f 1)

http://python.cx/blog/article/3
http://xgu.ru/wiki/Работа_с_модулями_в_Python

Удаление ненужных пакетов

$ pip install pip-autoremove
$ pip install Flask Sphinx
$ pip-autoremove Flask Sphinx -y
http://python.cx/blog/article/PyPi_pip_python


Проверка наличия



Проверка существования переменной в локальной видимости
if 'myVar' in locals():
# myVar exists

Проверка существования переменной в глобальной видимости
if 'myVar' in globals():
# myVar exists

Проверка существования переменной используя исключения
try:
myVar
except NameError:
myVar = None

Проверка существования ключа в словаре способ 1
if key in dictname:
# key exists in dictname

Проверка существования ключа в словаре способ 2
try:
dictname['key']
except KeyError:
dictname['key'] = None

Проверка существования индекса в списке
try:
dictname['1']
except IndexError:
dictname['1'] = None

Проверка наличия метода, свойства в объекте
if hasattr(obj, 'attr_name'):
# obj.attr_name exists


Оболочки, библиотеки



https://ipython.org/
http://xon.sh/
https://amoffat.github.io/sh/
https://github.com/selectel/pyte
https://github.com/eliangcs/http-prompt
http://bpython-interpreter.org/
https://github.com/jonathanslenders/ptpython
https://github.com/jonathanslenders/pymux/
https://github.com/jonathanslenders/python-prompt-toolkit


Исходный код



Посмотреть код функции:
>>> import inspect
>>> import abc
>>> print(inspect.getsourcefile(abc))
/usr/lib/python3.4/abc.py
>>> print(inspect.getsource(abc))
# Copyright 2007 Google, Inc. All Rights Reserved.
# Licensed to PSF under a Contributor Agreement.

"""Abstract Base Classes (ABCs) according to PEP 3119."""

from _weakrefset import WeakSet
.................
>>> print(inspect.getmodule(abc))
<module 'abc' from '/usr/lib/python3.4/abc.py'>
при попытке посмотреть код созданной в интерпретаторе функции выдаст ошибку:
 
>>> def object():
...     print("hello")
... 
>>> print(inspect.getsource(object))
..................
OSError: could not get source code

но это возможно в IPython:

In [1]: def object():
   ...:     print("hello")
   ...:     

In [2]: import inspect

In [3]: print(inspect.getsource(object))
def object():
    print("hello")

или с помощью сторонних модулей:
нужно установить dill
sudo apt install python3-dill
или
sudo pip3 install dill

>>> def object():
...     print("hello")
... 
>>> import dill
>>> print(dill.source.getsource(object))
def object():
    print("hello")

>>> import dis
>>> dis.dis(object)
  2           0 LOAD_GLOBAL              0 (print)
              3 LOAD_CONST               1 ('hello')
              6 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
              9 POP_TOP
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE
>>> 


Операции с числами



round(632.742774, 3) # округлит до 632.743 (3 - сколько знаков после запятой)

a=[1, 2, 3, 4]
for x in a: print(x + 3, end = ',')
list(map((lambda x: x + 3), a))

from math import *
D={'S':sin, 'C':cos, 'E':exp}
D['S'](pi/2)
D['C'](pi)
D['E'](1)

http://ru_python.livejournal.com/337028.html
>>> from decimal import Decimal
>>> Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')
Decimal('0.0')
>>> from fractions import Fraction
>>> Fraction(1,10)+Fraction(1,10)+Fraction(1,10)-Fraction(3,10)
Fraction(0, 1)

from fractions import Fraction as fr
>>> fr('1/3') + fr('1/3') + fr('1/3')
Fraction(1, 1)
>>> fr('9/7') - fr('20/21')
Fraction(1, 3)
>>>
>>> from sympy import *
>>> x = Symbol('x')
>>> y = Symbol('y')
>>> x + x + y*3 -y
2*x + 2*y
>>> expand((x+1)*(y-1)**3)
x*y**3 - 3*x*y**2 + 3*x*y - x + y**3 - 3*y**2 + 3*y - 1
>>> expand(cos(x+y), trig=True)
-sin(x)*sin(y) + cos(x)*cos(y)
>>> simplify((x+x*x*y)/x)
x*y + 1
>>> solve(x**2 - y, x)
[-sqrt(y), sqrt(y)]
>>> solve(exp(x)+1, x)
[I*pi]

особенности двоичной математики
>>> 0.1+0.1+0.1-0.3
5.551115123125783e-17
>>> 0.7-0.5-0.2
-5.551115123125783e-17
>>> (0.1+0.1+0.1-0.3)-(0.7-0.5-0.2)
1.1102230246251565e-16
>>> (0.7-0.5-0.2)-(0.1+0.1+0.1-0.3)
-1.1102230246251565e-16

зато тут магия куда то делась
>>> (0.1+0.1+0.1-0.3)+(0.7-0.5-0.2)
0.0

>>> 0.1 + 0.1 + 0.1 - 0.3 == 1.0 / (2**54)
True
>>> 0.7-0.5-0.2 == -1.0 / (2**54)
True
>>> 5.551115123125783e-17 == 1.0 / (2**54)
True
>>> 0.1 + 0.1 + 0.1 - 0.3 == math.pow(2, -54)
True


Работа с файлами



open('/home/user/path/hello.txt', 'w') # создаст пустой файл (аналог touch hello.txt)

f=open('/home/user/path/hello.txt', 'w') # создать или открыть существующий файл hello.txt на запись
'r' открытие на чтение (является значением по умолчанию).
'w' открытие на запись, содержимое файла удаляется, если файла не существует, создается новый.
'x' открытие на запись, если файла не существует, иначе исключение.
'a' открытие на дозапись, информация добавляется в конец файла.
'b' открытие в двоичном режиме.
't' открытие в текстовом режиме (является значением по умолчанию).
'+' открытие на чтение и запись
'r+' означает, что файл доступен как для чтения, так и  для записи,
при этом содержимое существующих файлов сохраняется
'w+', позволяет выполнять операции чтения и записи, но создает файл заново,
уничтожая прежнее его содержимое

f.write('Привет, всё норм.')
f.close()# закрыть файл

f=open('/home/user/path/hello.txt', 'r') # открыть файл на чтение

f.read(8) # читает 8 символов
f.readline() # читает построчно
f.__next__()
next(f)
f.readlines() # читает файл целиком
f.readlines(200) # читает 200 символов
f.seek(0) # перейти в начало файла # цифры - позиция
f.close()

f=open('/home/user/path/hello.txt', 'a') # открыть файл на дозапись
ABC='очень,очень,многобукав' # создание переменной ABC

f.writelines('ABC') # допишет в файл буквы ABC
f.writelines(ABC) # допишет в файл очень,очень,многобукав

for line in output.splitlines(): print(line) # разбить текст на отдельные строки

file.writelines(['Hello file world!\n', 'Bye file world.\n']) # записывает все строки из списка

list(map(str.rstrip, open('/home/user/path/hello.txt').readlines(200))) # прочтёт 200 символов, без /n перевода строки

list(map(str.splitlines, open('/home/user/path/hello.txt').readlines(200)))

open('somefile.txt', 'w').write("G'day Bruce\n") # записать во временный файл
open('somefile.txt', 'r').read() # прочитать временный файл

После окончания работы с файлом его обязательно нужно закрыть с помощью метода close:
file.close()
with open(filename) as myfile # с применением менеджера контекста (гарантировано закрыть файл после использования)

пример передачи данных с текстового файла в переменную
cat /path/to/file
NAME="file1"
VERSION=1.1.1

def get_version():
    with open('/path/to/file','r') as myfile:
        content = myfile.read()
        values = content.split("\n")
        get_version_file = str(content.split("\n")[content.count('VERSION')]).split('=')[-1]
    return get_version_file

#file_src = get_version()
file_src = '"{0}"'.format(str(get_version())) # чтоб в кавычках было
print("version = ", file_src )

поиск файлов

import glob
glob.glob('/usr/src/*.deb') # покажет список deb пакетов в /usr/src, поиск файлов по маске
os.system('grep -r /usr/lib/python3 -e __all__ ')

сравнение файлов

import filecmp
filecmp('/home/user/path/hello.txt', '/home/user/tmp/hello.txt') # сравнение файлов True - совпадают, False - нет

сравнение каталогов

filecmp.dircmp('/home/user/path', '/home/user/tmp').report() # сравнение каталогов
diff_files - сообщает о разнице меж одноимёнными файлами
same_files - сообщает о идентичных файлах в двух каталогах
common - выводит список общих имён и каталогов
report() - подробный отчёт о сравнении каталогов
report_full_closure() - подробный отчёт сравнения всех каталогов, вложенных файлов и каталогов

http://iakovlev.org/index.html?p=577&m=1&l1=2

Сортируем файлы с помощью Python
https://github.com/lesskop/file-sorter


Работа с БД



C:\...\PP4E\Dbase> python
>>> import dbm                  # получить интерфейс: bsddb, gnu, ndbm, dumb
>>> file = dbm.open('movie', 'c') # создать файл DBM с именем 'movie'
>>> file['Batman'] = 'Pow!'        # сохранить строку с ключом 'Batman'
>>> file.keys()                    # получить список ключей в файле
[b'Batman']
>>> file['Batman']                 # извлечь значение по ключу 'Batman'
b'Pow!'
>>> who = ['Robin', 'Cat-woman', 'Joker']
>>> what = ['Bang!', 'Splat!', 'Wham!']
>>> for i in range(len(who)):
...     file[who[i]] = what[i]     # добавить еще 3 "записи"
...
>>> file.keys()
[b'Cat-woman', b'Batman', b'Joker', b'Robin']
>>> len(file), 'Robin' in file, file['Joker']
(4, True, b'Wham!')
>>> for key in file.keys(): print(key, file[key])
>>> for key in file: print(key.decode(), file[key].decode())
>>> file['Batman'] = 'Ka-Boom!' # изменить значение ключа Batman
>>> del file['Robin']            # удалить запись Robin
>>> file.close()                   # иногда требуется закрывать явно


упаковка объектов

pickle
>>> table = {'a': [1, 2, 3],
             'b': ['spam', 'eggs'],
             'c': {'name':'bob'}}
>>>
>>> import pickle
>>> mydb = open('dbase', 'wb')
>>> pickle.dump(table, mydb)

C:\...\PP4E\Dbase> python
>>> import pickle
>>> mydb = open('dbase', 'rb')
>>> table = pickle.load(mydb)
>>> table
{'a': [1, 2, 3], 'c': {'name': 'bob'}, 'b': ['spam', 'eggs']}


shelve
import shelve
dbase = shelve.open("mydbase")
dbase['key'] = object # сохранить объект
value = dbase['key'] # извлечь объект
len(dbase) # количество хранящихся элементов
dbase.keys() # список ключей хранящихся элементов


JSON
http://python-lab.ru/documentation/27/stdlib/json.html
https://pythonworld.ru/moduli/modul-json.html
Кодирование JSON
>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'

>>> import json
>>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))
'[1,2,3,{"4":5,"6":7}]'

Красивый вывод:
>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True,
...                  indent=4, separators=(',', ': '))
{
    "4": 5,
    "6": 7
}

Декодироние JSON

>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}]

Использование json.tool из шелла для проверки и красивого вывода:
$ echo '{"json":"obj"}' | python -mjson.tool
{
    "json": "obj"
}


sqlite3
>>> import sqlite3
>>> conn = sqlite3.connect('dbase1') # при необходимости используйте полный путь к файлу
# мож­но пе­ре­дать спе­ци­аль­ную стро­ку «:memory:», что­бы соз­дать вре­мен­ную ба­зу дан­ных в па­мя­ти
>>> curs = conn.cursor()
>>> tblcmd = 'create table people (name char(30), job char(10), pay int(4))'
>>> curs.execute(tblcmd)
>>> curs.executemany('insert into people values (?, ?, ?)',
...          [ ('Sue', 'mus', '70000'),
...            ('Ann', 'mus', '60000')])
>>> rows = [['Tom', 'mgr', 100000],
...         ['Kim', 'adm', 30000],
...         ['pat', 'dev', 90000]]
>>> for row in rows:
...     curs.execute('insert into people values (? , ?, ?)', row)
...
>>> conn.commit() # сохранить изменения в базе
>>> curs.execute('select * from people') # выбрать записи
>>> curs.fetchall() # из­влечь записи
[('Bob', 'dev', 5000), ('Sue', 'mus', 70000), ('Ann', 'mus', 60000), ('Tom',
'mgr', 100000), ('Kim', 'adm', 30000), ('pat', 'dev', 90000)]

>>> for (name, job, pay) in curs.fetchall():
...     print(name, ':', pay)

>>> curs.execute('select * from people')
>>> colnames = [desc[0] for desc in curs.description]
>>> colnames
['name', 'job', 'pay']
>>> for row in curs.fetchall():
...     for name, value in zip(colnames, row):
...        print(name, '\t=>', value)
...    print()

>>> curs.execute('delete from people where name = ?', ['Bob'])
>>> curs.execute('delete from people where pay >= ?',(90000,))
>>> curs.execute('select * from people')
>>> curs.fetchall()
[('Sue', 'mus', 70000), ('Ann', 'mus', 65000), ('Kim', 'adm', 65000)]
>>> conn.commit()

>>> curs.execute('select * from people')
>>> colnames = [desc[0] for desc in curs.description]
>>> rowdicts = [dict(zip(colnames, row)) for row in curs.fetchall()]
>>> rowdicts[0]
{'pay': 70000, 'job': 'mus', 'name': 'Sue'}

>>> from sqlite3 import connect
>>> conn = connect('dbase1')
>>> curs = conn.cursor()
>>> curs.execute('delete from people')      # очистить таблицу
>>> curs.execute('select * from people')
>>> curs.fetchall()
[]
>>> file = open('data.txt')
>>> rows = [line.rstrip().split(',') for line in file]
>>> rows[0]
['bob', 'devel', '50000']

>>> curs.execute("select sum(pay), avg(pay) from people where job = 'devel'")
>>> curs.fetchall()
[(150000, 50000.0)]

http://www.internet-technologies.ru/articles/article_2190.html


records
>>> import records 
>>> db = records.Database('sqlite:///mydb.db') 
>>> 
>>> rows = db.query('SELECT * FROM cheese') 
>>> print(rows.dataset) 
name         |price 
-------------|----- 
red leicester|1.0 
wensleydale  |2.2 
>>> 
>>> print(rows.export('json')) 
[{"name": "red leicester", "price": 1.0}, {"name": "wensleydale", "price": 2.2}]

$ records 'SELECT * FROM cheese' yaml --url=sqlite:///mydb.db 
- {name: red leicester, price: 1.0} 
- {name: wensleydale, price: 2.2} 
$ records 'SELECT * FROM cheese' xlsx --url=sqlite:///mydb.db > cheeses.xlsx



Работа с архивами



создание архива
$ python3
>>> import shutil
>>> shutil.make_archive('/home/user/каталог/имя_архива', 'zip', '/home/user/path')

сделает архив содержимого каталога path и положит в указанном месте с указанным именем,
добавив расширение сжатия (zip), форматы сжатия zip gztar bztar xz

распаковка архива
$ python3
>>> import zipfile
>>> zipfile.ZipFile('/home/user/file.zip').extractall('/home/user/tmp/new')

распакует архив в папку new, папка будет создана, если её нет

или просто в консоли использовать модули python:
https://docs.python.org/3/library/tarfile.html

$ python3 -m tarfile -c $HOME/tmp/new_archiv.tar.bz2 $HOME/tmp/rt/ - создать архив
$ python3 -m tarfile -e $HOME/tmp/new_archiv.tar.bz2 $HOME/tmp/rt/1 - распаковать архив

аналогично для форматов tar.gz и tar.xz


Работа со строками



Строки. Функции и методы строк
Использование регулярных выражений в Python для новичков
41 вопрос о работе со строками в Python
в python3 достаточно просто присвоить строку
$ python3
>>> str='Самой используемой кодировкой в мире является utf8'
>>> str
'Самой используемой кодировкой в мире является utf8'

в python2 чуть больше телодвижений
$ python
>>> str=u'Самой используемой кодировкой в мире является utf8'
>>> print str
Самой используемой кодировкой в мире является utf8

Кодировки в python

Методы строк
str.find(substr)
Вы­пол­ня­ет по­иск под­стро­ки.
str.replace(old, new)
Вы­пол­ня­ет под­ста­нов­ку под­стро­ки.
str.split(delimiter)
Раз­би­ва­ет стро­ку по ука­зан­но­му раз­де­ли­те­лю или про­бель­ным сим­во­лам.
str.join(iterable)
Объ­еди­ня­ет под­стро­ки, встав­ляя раз­де­ли­те­ли ме­ж­ду ни­ми.
str.strip()
Уда­ля­ет ве­ду­щие и за­вер­шаю­щие про­бель­ные сим­во­лы.
str.rstrip()
Уда­ля­ет толь­ко за­вер­шаю­щие про­бель­ные сим­во­лы, ес­ли они име­ют­ся.
str.rjust(width)
Вы­рав­ни­ва­ет стро­ку по пра­во­му краю в по­ле фик­си­ро­ван­ной ши­ри­ны.
str.upper()
Пе­ре­во­дит все сим­во­лы в верх­ний ре­гистр.
str.isupper()
Про­ве­ря­ет – все ли сим­во­лы в стро­ке яв­ля­ют­ся сим­во­ла­ми верх­не­го ре­ги­ст­ра.
str.isdigit()
Про­ве­ря­ет – все ли сим­во­лы в стро­ке яв­ля­ют­ся циф­ра­ми.
str.endswith(substr-or-tuple)
Про­ве­ря­ет при­сут­ст­вие под­стро­ки (или од­но­го из ва­ри­ан­тов в кор­те­же) в кон­це дан­ной стро­ки.
str.startswith(substr-or-tuple)
Про­ве­ря­ет при­сут­ст­вие под­стро­ки (или од­но­го из ва­ри­ан­тов в кор­те­же) в на­ча­ле дан­ной стро­ки.


преобразование строк в кортеж, список и обратно
>>> 'spam eggs ham'.split()
['spam', 'eggs', 'ham']
>>> tuple(['spam', 'eggs', 'ham'])
('spam', 'eggs', 'ham')
>>> list(('spam', 'eggs', 'ham'))
['spam', 'eggs', 'ham']
>>> list('spam eggs ham')
['s', 'p', 'a', 'm', ' ', 'e', 'g', 'g', 's', ' ', 'h', 'a', 'm']
>>> ''.join(['s', 'p', 'a', 'm', ' ', 'e', 'g', 'g', 's', ' ', 'h', 'a', 'm'])
'spam eggs ham'
>>> '*'.join('spam eggs ham')
's*p*a*m* *e*g*g*s* *h*a*m'
>>> 's*p*a*m* *e*g*g*s* *h*a*m'.split('*')
['s', 'p', 'a', 'm', ' ', 'e', 'g', 'g', 's', ' ', 'h', 'a', 'm']
>>> ''.join(['s', 'p', 'a', 'm', ' ', 'e', 'g', 'g', 's', ' ', 'h', 'a', 'm'])
'spam eggs ham'

вредный совет
выпрямить вложенные списки с помощью функции sum()
>>> l=[['a', 'b', 'c'], ['1', '2'], ['#']]
>>> sum(l, [])
['a', 'b', 'c', '1', '2', '#']



столбик
типа 
perl -pa0e'$_=join",",@F' 1.txt > 2.txt
sed ':a;N;$!ba;s/\n/ /g' my.txt > my1.txt

>>> s="""
... Keujiuz8 
... ze5iiFee 
... chuF7hae 
... Quah8equ 
... UZiloh9A 
... quiWin0d 
... Fael9uo8 
... pheeph7M
... """
>>> s
'\nKeujiuz8 \nze5iiFee \nchuF7hae \nQuah8equ \nUZiloh9A \nquiWin0d \nFael9uo8 \npheeph7M\n'
>>> ' '.join(s.split())
'Keujiuz8 ze5iiFee chuF7hae Quah8equ UZiloh9A quiWin0d Fael9uo8 pheeph7M'

>>> d=s.split()
>>> for i in range(len(d)): print(d[i])
... 
Keujiuz8
ze5iiFee
chuF7hae
Quah8equ
UZiloh9A
quiWin0d
Fael9uo8
pheeph7M

>>> a=['sjdej', 'jsjjjsj', 'jdeechfeo']
>>> for i in a: print(i)
... 
sjdej
jsjjjsj
jdeechfeo

>>> for i in range(1,4): print ("abc"*i)
... 
abc
abcabc
abcabcabc

>>> for i in range(2, 22, 3): print('Номер ('+ str(i)+')')
... 
Номер (2)
Номер (5)
Номер (8)
Номер (11)
Номер (14)
Номер (17)
Номер (20)

>>> supplers = ['pens', 'staplers', 'binders']
>>> for i in range(len(supplers)):
...     print('Index ' + str(i) + ' in supplers is: ' + supplers[i])
... 
Index 0 in supplers is: pens
Index 1 in supplers is: staplers
Index 2 in supplers is: binders


регистр строки
>>> str='blablabla'
>>> str=str.upper()
>>> str
'BLABLABLA'
>>> str=str.lower()
>>> str
'blablabla'
>>> str=str.capitalize()
>>> str
'Blablabla'
>>> str=str.swapcase()
>>> str
'bLABLABLA'
>>> str=str.title()
>>> str
'Blablabla'
>>> 'bLABLABLA'.casefold()
'blablabla'


перевернуть строку
>>> a=list('habrahabr')
>>> a.reverse()
>>> ''.join(a)
'rbaharbah'

>>> 'hanrahabr'[::-1]
'rbaharnah'


Работа с ошибками
>>> import difflib 
>>> capitals = ('Montgomery', 'Juneau', 'Phoenix', 'Little Rock') 
>>> difflib.get_close_matches('Fenix', capitals) 
['Phoenix']


разные манипуляции
>>> 'spam eggs ham'[5:10]            # извлечение среза: подстрока
'eggs '
>>> 'spam ' + 'eggs ham'             # конкатенация (и *, len(), [ix])
'spam eggs ham'
>>> 'spam %s %s' % ('eggs', 'ham') # выражение форматирования: подстановка
'spam eggs ham'
>>> 'spam {} {}'.format('eggs', 'ham') # метод форматирования: альтернатива %
'spam eggs ham'
>>> 'spam = "%-5s", %+06d' % ('ham', 99) # более сложное форматирование
'spam = "ham ", +00099'
>>> 'spam = "{0:<5}", {1:+06}'.format('ham', 99)
'spam = "ham ", +00099'

>>> '-'.join([str(i) for i in range(10)])
'0-1-2-3-4-5-6-7-8-9'
>>> "bla {} blabl {} lala {}".format(1,2,3) 
'bla 1 blabl 2 lala 3'
>>> "bla {2} blabl {0:=10} lala {1}".format(1,2,3) 
'bla 3 blabl          1 lala 2'
>>> "bla   blabl  lala ".split()
['bla', 'blabl', 'lala']
>>> "blahblablhlala".split('h')
['bla', 'blabl', 'lala']
>>> "blahblablhlala".replace('a','z')
'blzhblzblhlzlz'
>>> '_'.join([str(i) for i in range(10)])
'0_1_2_3_4_5_6_7_8_9'

>>> y = {c.upper() * 4 for c in 'spamham'} # генератор множеств
>>> y
{'SSSS', 'AAAA', 'MMMM', 'HHHH', 'PPPP'}
>>>
>>> list(set([1, 2, 3, 1, 2]))             # удалит дубликаты из списка
[1, 2, 3]

>>> L = [{'n':3}, {'n':20}, {'n':0}, {'n':9}]
>>> L.sort(key=lambda x: x['n'])
>>> L
[{'n': 0}, {'n': 3}, {'n': 9}, {'n': 20}]

>>> L = [2, 4, 1, 3, 5]
>>> L.reverse()
>>> L
[5, 3, 1, 4, 2]
>>> L = [2, 4, 1, 3, 5]
>>> list(reversed(L))
[5, 3, 1, 4, 2]

>>> 'A B C D'.split()
['A', 'B', 'C', 'D']
>>> 'A+B+C+D'.split('+')
['A', 'B', 'C', 'D']
>>> '--'.join(['a', 'b', 'c'])
'a--b--c'

>>> 'aaa--bbb--ccc'.split('--')
['aaa', 'bbb', 'ccc']
>>> 'aaa--bbb--ccc'.replace('--', '...') 
'aaa...bbb...ccc' 

>>> x=[34,56]
>>> print((''.join(list(map(str,x)))),)
3456

удалить общие строки из двух списков

>>> a="abb bbb ccc eee".split()
>>> b="aab bbb ccd eee".split()
>>> aa=set(a)
>>> bb=set(b)
>>> c = bb.difference(aa)
>>> print(c)
{'aab', 'ccd'}

удаление повторяющихся в списке значений:

>>> nums = [1, 3, 2, 3, 1, 2, 3, 1, 2]
>>> unique_nums = list(set(nums))
>>> unique_nums
[1, 2, 3]



замена символов
Замена в строке с помощью Python

аналог sed 's/Windows/Linux/g'
>>> s='Windows Windows Windows'
>>> s.replace('Windows', 'Linux')
'Linux Linux Linux'

аналог sed -i 's/Windows/Linux/g' text
>>> old="Windows"
>>> new="Linux"
>>> text="Windows Windows Windows"
>>> import re
>>> print(re.sub(r'\bWindows\b', 'Linux', line))


бы­ст­ро за­ме­нить в фай­ле ка­ж­дый сим­вол та­бу­ля­ции че­тырь­мя точ­ка­ми
from sys import *
stdout.write(('.' * 4).join(stdin.read().split('\t'))) 

[a-zA-Z0-9_]+ со­от­вет­ст­ву­ет са­мой длин­ной стро­ке из од­но­го или бо­лее сим­во­лов букв, цифр или под­чер­ки­ва­ний. 
\w Лю­бой ал­фа­вит­но-циф­ро­вой сим­вол ([a-zA-Z0-9_] для ASCII)
[\t ]* со­от­вет­ст­ву­ет ну­лю или бо­лее та­бу­ля­ций и про­бе­лов        

>>> table = "".maketrans('12', '34', 'cs')
>>> '1212cs 5612cs cscs'.translate(table)
'3434 5634 '

>>> intab = "aeiou"
>>> outtab = "12345"
>>> trantab = str.maketrans(intab, outtab)
>>> str = "this is string example....wow!!!"
>>> print (str.translate(trantab))
th3s 3s str3ng 2x1mpl2....w4w!!!

strip() удаляет начальные и конечные пробелы
replace() удаляет все пробелы из строки
translate() избавиться от всех пробелов, а также от символов новой строки
" ".join(s.split()) избавиться от всех повторяющихся пробелов и символов новой строки
'строка'[1:] удалить первый символ строки

добавить символы в начало и конец строки
yourstring = "L{0}LL".format(yourstring) 
yourstring = ''.join(('L','yourstring','LL'))
yourstring = "L%sLL" % yourstring
yourstring = "L" + yourstring + "LL"

yourstring = '"'{0}'"'.format(yourstring) добавить кавычки в начало и конец строки



Очистка входных строковых данных
Полезные советы по Python, которых вы ещё не встречали
user_input = "This\nstring has\tsome whitespaces...\r\n"

character_map = {
 ord('\n') : ' ',
 ord('\t') : ' ',
 ord('\r') : None
}
user_input.translate(character_map)  # This string has some whitespaces... "


модуль re
аналог sed -i 's/Windows/Linux/g' text
>>> old="Windows"
>>> new="Linux"
>>> text="Windows Windows Windows"
>>> import re
>>> print(re.sub(r'\bWindows\b', 'Linux', line))

>>> import re
>>> re.split('--', 'aaa--bbb--ccc')
['aaa', 'bbb', 'ccc']
>>> re.sub('--', '...', 'aaa--bbb--ccc')    # случай с единственным разделителем
'aaa...bbb...ccc'
>>> re.split('--|==', 'aaa--bbb==ccc')      # разбить по -- или ==
['aaa', 'bbb', 'ccc']
>>> re.sub('--|==', '...', 'aaa--bbb==ccc') # заменить -- или ==
'aaa...bbb...ccc'
>>> re.split('[-=]', 'aaa-bbb=ccc')      # односимвольные альтернативы
['aaa', 'bbb', 'ccc']
>>> re.split('(--)|(==)', 'aaa--bbb==ccc')     # результат разбиения
['aaa', '--', None, 'bbb', None, '==', 'ccc'] # включает группы
>>> re.split('(?:--)|(?:==)', 'aaa--bbb==ccc') # часть выражения, не группы
['aaa', 'bbb', 'ccc']


использование обратного слэша
>>> a='Это не будет развернуто: \nновая строка'
>>> print(a)
Это не будет развернуто: 
новая строка
>>> a='Это не будет развернуто: \tновая строка'
>>> print(a)
Это не будет развернуто: 	новая строка
>>> a='Это не будет развернуто: \vновая строка'
>>> print(a)
Это не будет развернуто: 
                         новая строка
>>> a='Это не будет развернуто: \fновая строка'
>>> print(a)
Это не будет развернуто: 
                         новая строка
>>> a='Однажды Арнольд сказал: "I\'ll be back"'
>>> print(a)
Однажды Арнольд сказал: "I'll be back"


5 СПОСОБОВ ФОРМАТИРОВАНИЯ СТРОК
https://shultais.education/blog/python-f-strings

>>> name = "User"
>>> age = 100
>>> print("Меня зовут " + name + ". Мне " + str(age) + " лет.")
>>> Меня зовут User. Мне 100 лет.

>>> name = "User"
>>> age = 100
>>> print("Меня зовут %s. Мне %d лет." % (name, age))
>>> Меня зовут User. Мне 100 лет.
>>> print("Меня зовут %(name)s. Мне %(age)d лет." % {"name": name, "age": age})
>>> Меня зовут User. Мне 100 лет.

>>> from string import Template
>>> name = "User"
>>> age = 100
>>> s = Template('Меня зовут $name. Мне $age лет.')
>>> print(s.substitute(name=name, age=age))
>>> Меня зовут User. Мне 100 лет.

>>> name = "User"
>>> age = 100
>>> print("Меня зовут {}. Мне {} лет.".format(name, age)
>>> Меня зовут User. Мне 100 лет.
>>> print("Меня зовут {name} Мне {age} лет.".format(age=age, name=name)
>>> Меня зовут User. Мне 100 лет.

# начиная с Python 3.6
>>> name = "User" 
>>> age = 100
>>> print(f"Меня зовут {name} Мне {age} лет.")
>>> Меня зовут User. Мне 100 лет.


ПОГРУЖЕНЕ В F-СТРОКИ
>>> "обычная строка"
>>> f"f-строка"

f-строки также поддерживают расширенное форматирование чисел:
>>> from math import pi
>>> print(f"Значение числа pi: {pi:.2f}")
>>> Значение числа pi: 3.14

С помощью f-строк можно форматировать дату без вызова метода strftime():
>>> from datetime import datetime as dt
>>> now = dt.now()
>>> print(f"Текущее время {now:%d.%m.%Y %H:%M}")
>>> Текущее время 24.02.2017 15:51

Они поддерживают базовые арифметические операции. Да, прямо в строках:
>>> x = 10
>>> y = 5
>>> print(f"{x} x {y} / 2 = {x * y / 2}")
>>> 10 x 5 / 2 = 25.0

Позволяют обращаться к значениям списков по индексу:
>>> planets = ["Меркурий", "Венера", "Земля", "Марс"]
>>> print(f"Мы живим не планете {planets[2]}")
>>> Мы живим не планете Земля

А также к элементам словаря по ключу:
>>> planet = {"name": "Земля", "radius": 6378000}
>>> print(f"Планета {planet['name']}. Радиус {planet['radius']/1000} км.")
>>> Планета Земля. Радиус 6378.0 км. 

Причем вы можете использовать как строковые, так и числовые ключи. Точно также как в обычном Python коде:
>>> digits = {0: 'ноль', 'one': 'один'}
>>> print(f"0 - {digits[0]}, 1 - {digits['one']}")
>>> 0 - ноль, 1 - один

Вы можете вызывать в f-строках методы объектов:
>>> name = "User"
>>> print(f"Имя: {name.upper()}")
>>> Имя: User

А также вызывать функции:
>>> print(f"13 / 3 = {round(13/3)}")
>>> 13 / 3 = 4


zip + list

http://blog.lerner.co.il/implementing-zip-list-comprehensions/
>>> s = 'abc'
>>> t = (10, 20, 30)
>>> u = (-5, -10, -15)
>>> list(zip(s,t,u))
[('a', 10, -5), ('b', 20, -10), ('c', 30, -15)]
>>> [(s[i], t[i]) for i in range(len(s))] 
[('a', 10), ('b', 20), ('c', 30)]
>>> [(s[i], t[i]) for i in range(len(sorted((s,t), key=len)[0]))]
[('a', 10), ('b', 20), ('c', 30)]
>>> def shortest_sequence_range(*args):
...     return range(len(sorted(args, key=len)[0]))
... 
>>> [(s[i], t[i]) for i in shortest_sequence_range(s,t) ]
[('a', 10), ('b', 20), ('c', 30)]
>>> g = ((s[i], t[i]) for i in shortest_sequence_range(s,t) )
>>> for item in g: print(item)
... 
('a', 10)
('b', 20)
('c', 30)

>>> names = ['Tom', 'Dick', 'Harry']
>>> ages = [50, 35, 60]
>>> dict(zip(names, ages))
{'Harry': 60, 'Dick': 35, 'Tom': 50}



Работа с текстом




Сравнение содержания двух текстовых файлов
http://www.cyberforum.ru/python/thread1452346.html
http://aidalinux.ru/w/Grep
grep: коллекция примеров использования
вместо
grep -F -f 2.txt 1.txt > 3.txt (все совпадающие)
grep -Fv -f 2.txt 1.txt > 3.txt (разница)
grep -i -Fv -f 2.txt 1.txt > 3.txt (разница без учёта регистра)
pcregrep -vFf 2.txt 1.txt

эти точнее
diff --old-line-format=$'%l\n' --new-line-format='' --unchanged-line-format='' <(sort -u 2.txt) <(sort -u 1.txt)
comm -23 1.txt 2.txt
comm -13 <(sort -u 1.txt) <(sort -u 2.txt)|cat > output
Compare-Object (gc 1.txt) (gc 2.txt)  -PassThru


$ cat 1.txt
one two three four
$ cat 2.txt
two three one

вначале привести к одинаковому регистру 
типа
$ tr '[:upper:]' '[:lower:]'  lower.txt

Все буквы будут большими:
$ sed -i 's/.*/\U&/' 1.txt

Все буквы будут маленькими:
$ sed -i 's/.*/\L&/' 1.txt

>>> with open('1.txt', 'r',  encoding='utf-8-sig') as fileinput: fileinput.read().lower();

>>> data = [set(open(i).read().split()) for i in ('1.txt', '2.txt')]
>>> print(data[0].difference(data[1]))

nano diff_files1.py


python3 -m diff_files1


# запись
with open("filename.txt", "w") as file: file.write("hello world")

# чтение целиком
for line in open('filename.txt'): print(line)


# построчное чтение

for line in open('filename.txt').xreadlines(): print(line)
# в python2x

for line in open('filename.txt').readlines(): print(line, end='') # в python3x

B = 'spamspamspam'
open('savetree.txt', 'w').write(str(B))
# Сохранить в файл для последующего просмотра
open('latindata', 'w', encoding='latin-1').write(B) # Запись в latin-1
open('utf8data', 'w', encoding='utf-8').write(B) # Запись в utf-8
open('latindata', 'r', encoding='latin-1').read() # Декодирование выполняется при чтении
open('utf8data', 'r', encoding='utf-8').read() # в соответствии с названием кодировки
open('latindata', 'rb').read() # Прочитать двоичные данные


import pysed
print(pysed.replace("очень очень много букв", 'о', '!!!!'))
http://rtfm.co.ua/python-modul-pysed-rasshirennyj-analog-redaktora-sed/
https://pypi.python.org/pypi/pysed

правильное чтение



найти слово в тексте
https://pynative.com/python-search-for-a-string-in-text-files/



транслитерация

pip install transliterate
>>> from transliterate import translit
>>> print(translit(u"всякий разный текст", 'ru', reversed=True))



Кодировки



# -*- coding: utf-8 -*-
или
# coding: utf8

import sys
sys.getdefaultencoding() # Кодировка по умолчанию
import encodings.aliases
list(encodings.aliases.aliases)
print(encodings.aliases.aliases)
import encodings.aliases
arr = encodings.aliases.aliases
keys = list(arr.keys())
keys.sort() 
for key in keys: 
    print("%s => %s"% (key, arr[key]))

>>> from encodings.aliases import aliases
>>> def find(q):
...     return [(k,v) for k, v in aliases.items() if q in k or q in v]
...
>>> find('1252') # multiple aliases
[('1252', 'cp1252'), ('windows_1252', 'cp1252')]
>>> find('koi')
[('cskoi8r', 'koi8_r')]
>>> a=find('')
>>> a.sort()
>>> print(a)
[большой список]

import pkgutil
import encodings
false_positives = set(["aliases"])
found = set(name for imp, name, ispkg in pkgutil.iter_modules(encodings.__path__) if not ispkg)
found.difference_update(false_positives)
print(found)

>>> import chardet
>>> s = '\xe2\x98\x83' # ☃
>>> chardet.detect(s)
{'confidence': 0.505, 'encoding': 'utf-8'}

from encodings.aliases import aliases
print aliases.keys()

import os
import encodings
os.listdir(os.path.dirname(encodings.__file__))

https://docs.python.org/3/library/codecs.html#standard-encodings
https://docs.python.org/3/library/codecs.html#python-specific-encodings
http://stackoverflow.com/questions/1728376/get-a-list-of-all-the-encodings-python-can-encode-to


Ше­ст­на­дца­терич­ное зна­че­ние ко­да ASCII



>>> hex(ord('&'))
'0x26'
>>> hex(ord('+'))
'0x2b'




учебное пособие

I. Потоковый редактор sed


Команда имеет формат:

    sed [ -n ] [ -e script ] [ -f sfile ] [ files ]

Команда копирует файлы (по умолчанию со стандартного

входа) на стандартный выход, редактирует их в соответствии со

своими(!) командами, размещенными в "script" (в командном

файле или строке редактора [а не shell!]). По флагу "-f"

берет берет файл команд из файла "sfile"; Если есть

только опция "-e script", то флаг "-e" можно

опустить. Флаг "-n" подавляет вывод (происходящий по

умолчанию). "script" состоит из команд редактирования,

по одной в строке, имеющих формат:

    [ addr [ , addr ] ] cmd [ args ]



"sed" циклически преобразует входные строки

в выходные.

Адреса "[ addr [ , addr ] ]" - это либо

номера строк, либо последняя строка (символ "$"), либо

регулярные выражения в стиле редактора "ed":



  • "\" используется в многострочных командах

    для экранирования продолжения строки.

  • "." совпадает с любым символом.

  • Если адреса не указаны - просматриваются все входные

    строки.

  • Если один адрес, то выбираются совпадающие строки.

  • Если заданы два адреса, выбираются строки в заданном

    интервале.

  • "!cmd" выполняется команда "cmd",

    для строк, которые не были выбраны по адресам.



Для следующих (основных) функций (команд) максимальное

число допустимых адресов указано в скобках.

(1)a\ text Добавляет text после указанной строки

Команда:

    who


Результат:

    root tty1 Mar 13 17:23

    mas tty2 Mar 13 18:50

    sae tty6 Mar 13 17:24

    sae tty5 Mar 13 17:24


Пример:

    who | sed '2a\

    новая строка

'


Результат:

root tty1 Mar 13 17:23

mas tty2 Mar 13 18:50

новая строка

sae tty6 Mar 13 17:24

sae tty5 Mar 13 17:24



(2)b label Осуществляет переход к команде ("cmd")

"label:cmd". Если метка ("label") отсутствует,

то переход на конец командного файла.

Пример:

who | sed '2a\

новая строка

b lb

2d

: lb 3d

'


Результат:

root tty1 Mar 13 17:23

mas tty2 Mar 13 18:50

новая строка

sae tty5 Mar 13 17:24



(2)c\ text Удаляет выбранные строки и заменяет их на "text'.

Пример:

who | sed '/sae/ c\

cтрока замены

'


Результат:

root tty1 Mar 13 17:23

mas tty2 Mar 13 18:50

строка замены

строка замены



(2)d Удаляет найденные строки

Пример:

who | sed '2,4d'


Результат:

root tty1 Mar 13 17:23



(1)i\ text Вставляет "text" на место выбранной

строки. (сравните с "a\")

Пример:

who | sed '2i\

новая строка

'


Результат:

root tty1 Mar 13 17:23

новая строка

mas tty2 Mar 13 18:50

sae tty6 Mar 13 17:24

sae tty5 Mar 13 17:24



(2)p Выводит найденные строки (используется с флагом

"-n").

(1)q Выходит из "sed".

(2)r rfile Читает файл "rfile" и выдает на выход.

(2)s/reg_expr/rpl/flags Заменяет регулярное выражение "reg_expr"

на "rpl" с учетом флагов "flags":

g глобально (по всей строке)

p выводить замены

w wfile сохранять заменяемое в "wfile".




Пример:

who | sed 's/t/T/'

echo

who | sed 's/t/T/g'


Результат:

rooT tty1 Mar 13 17:23

mas Tty2 Mar 13 18:50

sae Tty6 Mar 13 17:24

sae Tty5 Mar 13 17:24


rooT TTy1 Mar 13 17:23

mas TTy2 Mar 13 18:50

sae TTy6 Mar 13 17:24

sae TTy5 Mar 13 17:24



(2)y/str1/str2/ Заменяет все вхождения символов "str1" соответствующими символами "str2". Длины строк должны быть одинаковыми.

Пример:

who | sed 'y/sae/SAE/'


Результат:

root tty1 MAr 13 17:23

mAS tty2 MAr 13 18:50

SAE tty6 MAr 13 17:24

SAE tty5 MAr 13 17:24



(2)! Cmd Команда(ы) "cmd" применяются к

невыбранным строкам.

Пример:

who | sed '2,4!d'


Результат:

mas tty2 Mar 13 18:50

sae tty6 Mar 13 17:24

sae tty5 Mar 13 17:24



(1)= Выдает номера строк.

Пример:

who | sed =


Результат:

    1

    root tty1 Mar 13 17:23

    2

    mas tty2 Mar 13 18:50

    3

    sae tty6 Mar 13 17:24

    4

    sae tty5 Mar 13 17:24



(2){ } Скобки группируют команды.

II. Язык обработки шаблонов awk





awk - команда контекстного поиска и преобразования текста. Она - фильтр. Ее можно рассматривать как оболочку "awk" в оболочке "shell".



1. Структура awk-программы



Программа состоит из операторов (правил), имеющих

вид:

шаблон {действие}

шаблон {действие}

. . .


Частные случаи:



  • {действие} - когда действие выполняется для всех

    строк.

  • шаблон - когда выводятся строки с данным шаблоном.



Действие может состоять из последовательности операторов,

разделяемой ";" или переводом строки или закрывающей

скобкой.

Возможны комментарии (как в shell "#.........").

Пример:


Для дальнейших примеров возьмем входной файл "f-awk"

( фамилия инициалы год-приема-на-работу возраст ):

Иванов И.И. 1980

50
Петров А.В. 1979 40

Сидоров С.К. 1979 40

Хведоров И.Х. 1970 60


awk '{print}' f-awk # выдает весь текст;

echo

awk '/до/ {print}' f-awk # выдает строки, где есть "до".

echo

awk '/до/ {}' f-awk # выдает строки, где есть "до"

echo

awk '/до/ {print("Привет!")}' f-awk


Результат:

Иванов И.И. 1980 50

Петров А.В. 1979 40

Сидоров С.К. 1979 40

Хведоров И.Х. 1970 60 


Сидоров С.К. 1979 40

Хведоров И.Х. 1970 60 


Сидоров С.К. 1979 40

Хведоров И.Х. 1970 60 


Привет!

Привет!


Существует два оператора специального вида ("BEGIN"-начальные

установки и "END" - "последействия"):

BEGIN {действие}

шаблон {действие}

шаблон {действие}

. . .

END {действие}





2. Вызов awk



Возможны два основных варианта:

    1)  awk [-Fc] 'prog.awk' [files]


Это простейший случай, когда программа (заключенная

в кавычки " ' ") находится в теле команды, "-Fc"

- флаг, меняющий стандартный разделитель полей на "c"

"file" - имя файла исходных данных, при его отсутствии

- со стандартного входа. (Этот формат использован в начальных

примерах).

cat f-awk | awk '/до/ {print}'

и

awk '/до/ {print}' < f-awk


дают результат, аналогичный

awk '/до/ {print}' f-awk


Для демонстрации действия флага "-Fc" рассмотрим

вызовы:

awk '/до/ {print($2)}' f-awk

awk -F0 '/до/ {print($2)}' f-awk

На экран будет выведено:

С.К.

И.Х.

6


Первая команда "awk" выведет вторые поля

(благодаря позиционной переменной "$2") строк, содержащие

"до". (Кстати, позиционная переменная "$0"

соответсвует всей строке). Во втором случае, благодаря флагу "-F"

стандартные разделители заменены на символ "0", т.е.

теперь выбранные строки воспринимаются, как разбитые на следующие

поля:

Сидоров С.К. 1979 40

---------------------^--------------------

1-е поле 2-е поле (пусто)


Хведоров И.Х. 1970 60

-----------------^---^--------------------

1-е поле 2-е 3-е поле (пусто)


    2) awk [-Fc] -f prog.awk [files]


Флаг "-f" говорит о том, что awk-программу

надо брать из файла, имя которого указано следом (имя может быть

произвольным и расширение ".awk" добавлено здесь просто

из эстетических соображений).



3. awk-переменные и выражения



В языке awk выделяются две группы переменных: предопределенные

и декларированные в программе. Исходные значения предопределенных

переменных устанавливаются интерпретатором awk в процессе запуска

и выполнения awk-программы.

К предопределенным относятся:

Умолчания:
NR - номер текущей строки

NF - число полей в текущей строке

RS - разделитель строк на вводе

"\0"
FS - разделитель полей на вводе

пробел и/или табуляция
ORS - разделитель строк на выводе

RS
OFS - разделитель полей на выводе

FS
OFMT - формат вывода чиcл

"%.6g"
FILENAME - имя входного файла.



Прочим переменным пользователь может присваивать начальные значения.

По умолчанию "0" или пустая строка (что здесь равнозначно!).

Типы переменных:



  • позиционные,

  • числа с плавающей точкой,

  • строка символов,

  • массив.



Интерпретатор awk рассматривает переменную как строковую,

пока не возникает необходимость выполнить операции:



  • если пробел (конкатенация), то строки;

  • если "+", то числа с плавающей точкой.



Примеры:

1. awk '{a = $3 $4; print a}' f-awk awk '{a = $3+$4; print a}' f-awk



Результат:
198050

197940

197940

197060

2030

2019

2019

2030

2. awk '{} END {a = 2 + 2 ; print a}' < f-awk awk '{} END {a = 2 + "2" ; print a}' < f-awk awk '{} END {a = 2 + "два" ; print a}' < f-awk awk '{} END {a = "два"+"два" ; print a}' < f-awk awk '{} END {a = 2.2 + 2.000 ; print a}' < f-awk



Результат:

4

4

2

0

4.2


Массив не об'является, а начинае существовать в момент

первого использования. Индекс массива - любое ненулевое значение

или строка. Массивы ассоциативные, т.е. не по вычисляемому индексу,

а по совпадению содержания, например:

day [Jan][31] = Mon

day [Feb][01] = Tue

day [Feb][02] = Wed


Массивы удобно использовать при суммированиях, например

записи выплат имеют вид (файл "p-1"):

John 100

Mary 200

Mary 200

John 100

John 300



awk '{sum[$1] += $2; print $1 sum[$1]} ' < p-1


Результат (поименный нарастающий итог):

John100

Mary200

Mary400

John200

John500


Операции как в Си=, +=, -=, *=, /=, %=, +, /, %, ++, --.

Сравнения чисел, если оба числа, иначе - строк

<, <=, ==, !=, >=, >

Логические операции!, ||, &&

Операция "пробел"конкатенация.





4. Примеры awk-программ



1) awk '{print ($2, $3)}' f-awk


Результат:

И.И. 1980

А.В. 1979

С.К. 1979

И.Х. 1970

2) awk '/е/ {print ($2, $3)}' f-awk


Результат:

А.В. 1979

И.Х. 1970

3) awk '/е/ {print ($1, 2000 - $3)}' f-awk


Результат:

Петров 21

Хведоров 30


4) awk '{ s = s + $4}

END {print ("Суммарный возраст:" s)

print ("Средний возраст:" s/NR)}' f-awk


Результат:

Суммарный возраст:190

Средний возраст:47.5


5) awk '{ s += $4 }

{print("NR="NR, "NF="NF)}

END {print ("FILENAME=" FILENAME)

print ("Значение позиционной переменной" $4 "\"пусто\" \

после окончания просмотра)")

print ("Суммарный возраст:" s)

print ("Средний возраст:" s/NR)}' f-awk


Результат:

NR=1 NF=4

NR=2 NF=4

NR=3 NF=4

NR=4 NF=4

FILENAME=f-awk


Значение позиционной переменной"пусто"

(после окончания просмотра)

Суммарный возраст:190

Средний возраст:47.5 





5. Селекторы



Здесь "селектор" следует понимать, как

расширение понятия "шаблон", поскольку там где в структуре

команды указан шаблон, в общем случае может стоять любой селектор.

Замечание. Открывающая

скобка действия "{" должна быть в строке селектора.

В качестве селектора может быть:



  1. выражение;

  2. шаблон;

  3. их комбинация.



Соответствующие примеры:

1) $3 != $4 && $3 > 1970

$3 % 2 == 1

$1=="Иванов" - кавычки, чтобы воспринималось, как строка.


2) /ab/ отлично от /a b/, / ab/ и /ab /

Nполя ^шаблон - по совпадению

Nполя !^шаблон - по несовпадению


Пример:

awk '$3~0 {print} ' < f-awk

echo

awk '$3!~0 {print} ' < f-awk



Иванов И.И. 1980 50

Хведоров И.Х. 1970 60 

Петров А.В. 1979 40

Сидоров С.К. 1979 40



3) Шаблон может формировать множество образцов или

указывать, в каком месте поля искать:

/^a/ поле начинается с "a"

/a$/ поле кончается "a"

\+ экранирует оператор
[abc] любой из символов "a", "b" и "c"

[a-р] любой символ диапазона

* 0 или больше вхождений регулярного выражения

+ 1 или больше вхождений регулярного выражения

? 0 или 1 вхождение регулярного выражения

ab|cd "ab" или "cd"



Примеры сочетаний:

awk ' $3~/(7[0-9])$/ {print} ' f-awk


Результат:

Петров А.В. 1979 40

Сидоров С.К. 1979 40

Хведоров И.Х. 1970 60


То есть в третьем поле выделить 70-е годы (7 и еще

одна цифра от конца поля).



6. Еще примеры



1) awk '$1=="Иванов" {print} ' f-awk


Результат:

Иванов И.И. 1980 50


2) awk '$4/2==30 {print} ' f-awk


Результат:

Хведоров И.Х. 1970 60


3) awk '$3 != $4 && $3 > 1970 {print} ' f-awk


Результат:

Иванов И.И. 1980 50

Петров А.В. 1979 40

Сидоров С.К. 1979 40


4) awk '$1~/нов$/ {print} ' f-awk


Результат:

Иванов И.И. 1980 50


5) awk '/^Ив|дор/ {print} ' f-awk


Результат:

Иванов И.И. 1980 50

Сидоров С.К. 1979 40

Хведоров И.Х. 1970 60


6) awk '/1980/,/1979/ {print} ' f-awk


Результат:

Иванов И.И. 1980 50

Петров А.В. 1979 40 





7. Действия



В awk возможны следующие действия:



  1. присваивания выражений;

  2. операторы управления

  3. операторы вывода;

  4. встроенные функции.



Операторы управления



Простейшие операторы

exit завершить выполнение программы;

next перейти к следующей строке, управление на начало awk-программы;

break выход из цикла;
continue переход к следующей итерации;



Структурные операторы



if (условие) {операторы} [else {операторы}]

while (условие) {операторы}

for (выражение; условие; выражение) {операторы}

for (индекс in имя_массива) {операторы}


Структурные операторы в значительной степени аналогичны

соответствующим операторам Си. В последнем случае для каждого

индекса выполняется блок. Текстовые индексы рассматриваются в

лексикографическом порядке.

Примеры

1) awk ' $4~/40/ {if($3<=1980) {print("Фамилия: " $1 )

M["40"]++}}

$4~/50/ {M["50"]++}

END {for(i in M)

{print(" i =" i " M[" i "]=" M[i])}} ' f-awk


Результат:

Фамилия: Петров

Фамилия: Сидоров

i =40 M[40]=2

i =50 M[50]=1


2) awk ' BEGIN {ORS = " "}

{ for(k=NF; k>0; --k) {print $k}

{print RS}

} ' f-awk |

sed 's/^ //'


Результат:

50 1980 И.И. Иванов 

40 1979 А.В. Петров 

40 1979 С.К. Сидоров 

60 1970 И.Х. Хведоров 


Здесь, кроме изменения очередности полей в строке

на противоположное (что делает цикл "for"), предварительно

устанавливается выходной разделитель - пробел и весь результат

предварительно выдается в одну строку, поэтому после обработки

каждой строки выдается команда "print RS" для перевода

выходной строки. Редактор "sed" подключен через конвейер,

чтобы убрать возможные пробелы в начале строки. Существенная деталь.

Если запустить лишь базовую структуру

awk '{ for(k=NF; k>0; --k) {print $k}}' f-awk


то все поля исходной таблицы с изменениями порядка

внутри прежних строк получим вытянутыми в один столбец переводом

строки:

50

1980

И.И.

Иванов

40

1979

А.В.

Петров

40

1979

С.К.

Сидоров

60

1970

И.Х.

Хведоров


Однако, если поставим ";" сразу после условия,

т.е. сделаем пустое тело цикла, за пределы которого вынесен "print

$k"

awk '{ for(k=NF; k>0; --k); {print $k}}' f-awk


то получим исходную таблицу

Иванов И.И. 1980 50

Петров А.В. 1979 40

Сидоров С.К. 1979 40

Хведоров И.Х. 1970 60


поскольку "$k" после выхода из цикла будет

иметь значение "0", а "$0" - соответсвует

всей строке в качестве значения(!), то "print $k" будет

после каждого цикла печатать полные строки.





8. Ввод и вывод данных



В общем случае в команде awk может быть указано несколько

файлов. Напомним форматы вызова команды:

awk [-Fc] 'prog.awk' [file ...]

awk [-Fc] -f prog.awk [file ...]

^


Файлы обрабатываются последовательно в указанном

порядке. Это можно использовать для "настройки" awk

команды при обработке последующих файлов.

Пусть файл "f0" имеет вид:

60 Сидоров


А файл awk-программы "prim.awk" имеет вид:

FILENAME == "f0" { # если просматривается файл "f0"

w1 = $2 # присваиваются значения переменным

w2 = $1 # w1 - Сидоров, w2 - 60

}

$1 == w1 { print ("фамилия: "$1)} # означенные переменные

$4 == w2 { print ("годы: " $4)} # используются в

# селекторах


Тогда при вызове команды

awk -f prim.awk f0 f-awk


Результат:

фамилия: Сидоров

годы: 60




То есть второе поле файла "f0" дает значение

переменной "w1", а первое - "w2". Эти переменные

используются в селекторах при обработке файла "f-awk".

Изменим программу в файле "f-awk":

FILENAME == "f0" {

w1 = $2

w2 = $1

next

}

{ print ("фамилия: "$1); next}

$4 == w2 { print ("годы: " $4)}


Результат:

фамилия: Иванов

фамилия: Петров

фамилия: Сидоров

фамилия: Хведоров


Если исключить первый оператор "next",

то в выходном файле появится дополнительно первая строка:

фамилия: 60


поскольку выбирается снова первое поле в певом файле

("f0"). Если исключить и второй "next", то

в выходном файле появится дополнительно последняя строка:

годы: 60


которая ранее не выводилась, так как в предшествующий

оператор " { print ("фамилия: "$1)}" заканчивал

работу на ПОСЛЕДНЕЙ строке файла "f-awk", поэтому "next"

пропускал последующую командную строку

$4 == w2 { print ("годы: " $4)}


И еще одна модификация в связи с вводом данных с

терминала. Вызов команды будет:

awk -f prim.awk f0 f-awk


А файл "prim.awk" примет вид:

BEGIN { print ("Введите годы и фамилию: ")}

FILENAME == "-" {

w1 = $2

w2 = $1

next

}

$1 == w1 { print ("фамилия: "$1); next}

$4 == w2 { print ("годы: " $4)}





9. Встроенные функции



Встроенные функции:

sin (expr)синус expr

cos (expr)косинус expr
exp (expr)возведение в степень expr

log (expr)натуральный логорифм expr

sqrt (expr)извлечение корня expr

int (expr)целая часть числа

length (s)длина строки s

printf (fmt, ...)форматирование (аналогично Си) по спецификации fmt.

substr (s, m, n)подстрока в n символов строки s, начинающаяся с m.

getline ()чтение следующей строки.

0конец файла, иначе 1.

index (s1, s2)номер позиции, с которой s1 совпадает с s2, иначе 0.

split (s, M, c)строка s разбивается элементы массива M по разделителю c (по умолчанию FS=" "); функция возвращает число полей.



Примеры.

1) awk ' BEGIN {FS = "."; a=0}

length ($1) > 8 {print (length ($1), $0);

a++

}

END {print ("Найдено строк: " a) }' f-awk


Результат:

9 Сидоров С.К. 1979 40

10 Хведоров И.Х. 1970 60

Найдено строк: 2


Здесь поля разделяются по ".", выбираются

строки у которых длина первого поля больше 8-ми, и их длина "length

($1)" печатается перед строкой "$0".

2) awk '{i=split($0, Name, ".");

for (j=1; j<=i; j++)

print ("Name[" j "]=" Name[j])

}' f-awk


Результат:

Name[1]=Иванов И

Name[2]=И

Name[3]= 1980 50

Name[1]=Петров А

Name[2]=В

Name[3]= 1979 40

Name[1]=Сидоров С

Name[2]=К

Name[3]= 1979 40

Name[1]=Хведоров И

Name[2]=Х

Name[3]= 1970 60


3) awk '{print (length)}' f-awk


Результат:

22

22

22

22


Поскольку все строки были выровнены пробелами, а

в длине строки учитываются все символы до конца строки.

4) awk '{printf "%7.2f %s\n", NR, $0}' f-awk

echo

awk '{printf "\t%s %s \n", NR, $0}' f-awk


Результат:

1.00 Иванов И.И. 1980 50

2.00 Петров А.В. 1979 40

3.00 Сидоров С.К. 1979 40

4.00 Хведоров И.Х. 1970 60


1 Иванов И.И. 1980 50 

2 Петров А.В. 1979 40 

3 Сидоров С.К. 1979 40 

4 Хведоров И.Х. 1970 60 


некоторые хитрости
Замена концов строк Windows/DOS (CR LF \r \n) на Linux (LF \n) в bash
В том же самом файле (добавляем параметр командной строки -i):
sed -i 's/\r$//' file.txt
В другой файл:
cat winfile.txt | sed -i 's/\r$//' >linuxfile.txt


Вставить строку в начало текстового файла в Linux
sed -i -e '1 s/^/First line\n/' file.txt

Добавление строки в начало файла. Строка содержится в переменной $FIRSTSTRING:
sed -i -e "1 s%^%$FIRSTSTRING\n%" file.txt

Замена строки, начинающейся с любого количества пробелов и/или со строки из переменной $START на строку, содержащуюся в переменной $REPLACE:
sed -i "s%^ *$START.*%$REPLACE%" file.txt


Использование переменных из bash-скрипта в sed
VAR1="Nado naiti"
VAR2="Nado zamenit'"

sed 's/$VAR1/$VAR2'
одинарные кавычки в команде sed все закэранируют, и sed будет искать черти что и с боку бантик.

Решение
1. Поменять одинарные кавычки на двойные.
2. Поменять sed’овский разделитель слэш (/) на что-нибудь другое, например на знак % (Уникальность программы sed в том, что она позволяет использовать любой разделитель, например знак подчеркивания)

VAR1="Nado naiti"
VAR2="Nado zamenit'"

sed "s%$VAR1%$VAR2"

преобразовать столбец в строку
sed ':a;N;$!ba;s/\n/ /g' my.txt > my1.txt

sed -i -e 's/$/ /' 3pa3oK.txt | tr '\n' ' '       №1=добавляет пробел в конец сток;
sed -i -e ':a;N;$!ba;s/\n//g' 3pa3oK.txt	  №2=объединяет строки;
sed -i 's/[ \t][ \t]*/\ /g' 3pa3oK.txt	          №3=меняет пробелы и таб. на один пробел
sed -i 's/^[ \t]*//;s/[ \t]*$//' 3pa3oK.txt       №4=убирает пробелы и таб. конца и начала файла


device=/dev/sda1
device_type=$(echo $(blkid ${device}) | sed -e 's/^.*\(TYPE=[^ ,]*\).*$/\1/' | cut -d '=' -f 2 | sed 's@"\(.*\)"@\1@' )
device_type=$(blkid ${device} | sed -r 's/^.*(TYPE=[^ ,]*).*$/\1/ ; s@"(.*)"@\1@' | cut -d '=' -f 2)
device_type=$(blkid ${device} | sed -r 's/^.*(TYPE=[^ ,]*).*$/\1/ ; s@"(.*)"@\1@ ; s|.*=||')
device_type=$(blkid ${device} | sed -r 's/^.*TYPE="(\S+)".*$/\1/')

https://ru.wikipedia.org/wiki/Регулярные_выражения
/^ начало строки
$/ конец строки
. любой символ
* последовательность Ноль или более раз
TYPE= часть строки, внутри которой ищем
\S не пробельный символ
\S+ символы после \S
"()" диапазон поиска
\1 переменная (первое вхождение)
\2 переменная (второй вхождение)


https://www.gnu.org/software/sed/manual/html_node/Regexp-Addresses.html
https://unix.stackexchange.com/questions/611179/sed-e-expression-1-char-1-unknown-command
sed: -e expression #1, char 1: unknown command: '|'
нужно указать, что используете другой разделитель в sedкоманде удаления, добавив обратную косую черту \ перед новым разделителем
sed '\|text|d' file

sed -i "#/путь/до/файла#d" file.txt - так sed не удалить строку
sed -i "\#/путь/до/файла#d" file.txt - так удалит


ссылки
https://ru.wikipedia.org/wiki/Sed
https://ru.wikipedia.org/wiki/Регулярные_выражения
http://citforum.ru/operating_systems/articles/sed_awk.shtml
Одно-строчные скрипты SED
Системное руководство по sed
Приложение B. Маленький учебник по Sed и Awk
Большая поваренная книга программиста. sed
http://www.lissyara.su/doc/programming/sed/
http://aidalinux.ru/w/Sed
Неинтерактивный текстовый редактор sed
Документация по sed
Редактирование /etc/network/interfaces в Debian средствами sed
Просто о sed
Примеры команды Sed
Bash-скрипты, часть 7: sed и обработка текстов

Поиск файлов по имени


Вероятно, Вам знакома такая проблема: Есть файл, и Вы не помните, куда его положили.


В этом случае удобна команда find. Как ее использовать? Конечно, к этой утилите поставляется большая man-страница, но мы рассмотрим некоторые типичные случаи. Просмотреть дерево каталогов, начиная с текущего, и найти файл lostfile.txt:



find . -name lostfile.txt -print
Read more... )
отсюда

Profile

uzverss: (Default)
uzverss

December 2024

S M T W T F S
12345 67
891011121314
15161718192021
22232425262728
293031    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 18th, 2025 04:29 am
Powered by Dreamwidth Studios