Источник:
1 |
http://habrahabr.ru/post/105926/ - вдохновитель :) |
Перенаправление вывода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Как и > в командной строке, вы можете использовать < для перенаправления файла, но уже на вход команде. Для многих команд, можно просто указать имя файла. К сожалению некоторые программы работают только со стандартным потоком ввода. Bash и другие шелы поддерживают концепцию «herefile». Это позволяет давать входные данные команде в виде набора строк с последующей командой, означающей окончание ввода последовательности значений. Проще всего это показать на примере: $ sort <<END apple cranberry banana END apple banana cranberry В приведенном выше примере, мы вводим слова apple, cranberry и banana, с последующим «END» для указания окончания ввода. Затем программа sort возвращается наши слова в алфавитном порядке. Использование ">>" Можно ожидать, >> будет в чем-то похожа на <<, но это не так. Она позволяет просто добавить вывод в файл, а не перезаписывать его каждый раз, как это делает >. Пример: $ echo Hi > myfile $ echo there. > myfile $ cat myfile there. Уупс! Мы потеряли часть с «Hi»! А вот что мы имели ввиду: $ echo Hi > myfile $ echo there. >> myfile $ cat myfile Hi there. $ echo "firstfile" > copyme.txt |
Пайпы:
1 2 3 4 5 6 7 8 9 10 11 12 |
Используя пайпы, мы можем передать вывод одной команды на вход другой. Символ | используется для подключения выхода команды слева, ко входу команды справа от него. $ echo "hi there" | wc В примере выше, команда echo печатает в вывод «hi there» с символом перевода строки в конце. Этот вывод обычно появляется в терминале, но канал перенаправляет его на вход команде wc, которая показывает количество строк, слов и символов. $ ls -s | sort -n В этом случае, ls -s обычно вывела бы текущую директорию на терминал, с указанием размера перед каждым файлом. Однако вместо этого, мы передаем вывод программе sort -n, которая численно отсортирует его. Это очень удобно для поиска файлов, которые занимают в директории больше всего места. |
Распаковывающий канал:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Для разархивации и распаковки файла, вы могли бы сделать следующее: $ bzip2 -d linux-2.4.16.tar.bz2 $ tar xvf linux-2.4.16.tar Недостаток такого метода — это создание промежуточного, разархивированного файла на диске. Поскольку tar может читать данные напрямую со своего входа (вместо указанного файла), мы можем получить тот же конечный результат используя пайп: $ bzip2 -dc linux-2.4.16.tar.bz2 | tar xvf - Сжатый тарбол был распакован и мы обошлись без промежуточного файла. Вот еще один пример пайпа: $ cat myfile.txt | sort | uniq | wc -l Мы используем cat для отправки содержимого myfile.txt команде sort. Когда sort получает данные на вход, она сортирует их построчно в алфавитном порядке, и отправляет в таком виде программе uniq. uniq удаляет повторяющиеся строки (кстати uniq, требует отсортированный список на входе) и отправляет результат на wc -l. Мы рассматривали команду wc ранее, но без ее опций. Когда указывается опция -l, то команда выводит только количество строк, количество слов и символов в этом случае не выводятся. Вы увидите, что такой пайп распечатает количество уникальных строк в текстовом файле. |
echo
1 2 3 4 5 6 |
echo - печатает свои аргументы на терминал Используйте опцию -e если хотите включить в вывод управляющие последовательности; например echo -e 'foo\nfoo' напечатает foo, затем перейдет на новую строку, затем снова напечатает foo. Используйте опцию -n чтобы запретить echo добавлять символ новой строки в конец вывода, как это сделано по-умолчанию. echo -e 'foo\nfoo' echo -n 'foo' echo -e " Имя хоста `hostname` \n Текущие время `date` " |
cat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
cat - напечатает содержимое указанного файла на терминал. cat foo.txt | blah cat foo.txt cat /etc/passwd cat file.txt | wc -l - посчитать число переводов строк cat file.txt | wc -w - посчитать число слов cat new.txt | sed '/ *#/d; /^ *$/d' > newfile - удаление комментариев и пустых строк cat filename.txt | sed '/^ $/d' > newfile - удаление пустых строк cat ~/.ssh/known_hosts | sed "[nomer_stroki_1],[nomer_stroki_2]d" > ~/.ssh/known_hosts - удаление строк(и) из файла с заранее известным номером Фишки перенаправления с помощью cat 0. Перенаправить текст в файл как есть (без преобразования переменных и т.д. Эфект достигается если стоп слово (в примере EOF) взято в кавыки ("EOF") cat << "EOF" > script.sh #!/bin/bash echo "${ggg}" EOF cat > script.sh << "EOF" #!/bin/bash echo "${ggg}" EOF 1. Перенаправить текст в файл с преобразованием переменных Нету кавычек в EOF, переменные будут переданы. cat << EOF > script.sh #!/bin/bash echo "${ggg}" EOF 2. пример проверки: Пишем в консоль ggg=500 Потом выполняем: cat << EOF > script.sh #!/bin/bash echo "${ggg}" EOF Проверяем что получилось, проверяем другие варианты работы cat cat script.sh |
tac
1 |
tac - похожа на cat, но печатает все строки в обратном порядке, другими словами, последняя строка печатается в первую очередь. |
sort
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
sort - выведет содержимое файла, указанного в командной строке, в алфавитном порядке Естественно, sort также может принимать ввод из пайпа. Наберите man sort чтобы ознакомиться с опциями команды, которые управляют вариантами сортировки. du -ks * | sort -n -r - Сортировать по размеру (kbytes) du -s /usr/share/* | sort -n - показать размер всех каталогов внутри каталога /usr/share/ и отсортировать по размеру (размер в Кб) ps uax | grep -v "\ 0\.0\ " | cut -c 1-120 | sort -nrk 3 | grep -v "USER"- программа ps покажет все процессы, grep уберёт лишние процессы программа, cut обрежет вывод (уберет лишний текст), sort произведет сортировку, grep уберёт строку со словом USER ps uax | sort -nrk 3 - сортировать по числу(-n) из третьей колонки(-k 3), в порядке убывания (от большего к меньшему) (-r) ps uax | tr -s " " | cut -f 1,2,3,11 | sort -nrk 3 | cut -c 1-100 - программа ps покажет все процессы, tr заменит все символы разделители на пробел (tr -s " "), с помощью cut мы выберем столбцы, отсортируем вывод по третьей колонке, в конце cut обрежет сроки до 100 символов ps uax | sort -nrk 3 | tr -s " " | cut -f 1,3,11 -d " " | head - программа ps покажет все процессы, sort отсортирует по третьему столбцу, tr заменит все символы разделители на пробел (tr -s " "), cut покажет три столбца (1,3,11), head выведет первые десять строк ps uax | sort -nrk 3 | tr -s " " | cut -f 1,3,14 -d " " | head -n3 - программа ps покажет все процессы, sort отсортирует по третьему столбцу, tr заменит все символы разделители на пробел (tr -s " "), cut покажет три столбца (1,3,14), head выведет первые три строки |
uniq
1 |
uniq - принимает уже отсортированный файл или поток данных (через пайп) и удаляет повторяющиеся строки. |
wc
1 2 3 4 5 |
wc - выводит количество строк, слов и символов в указанном файле или во входном потоке (из пайпа). Введите man wc чтобы узнать, как настроить вывод программы. wc -l filename - посчитать количество строк в файле cat file.txt | wc -l - посчитать число строк cat file.txt | wc -w - посчитать число слов |
head
1 2 3 |
head - выводит первые десять строк файла или потока. Используйте опцию -n, чтобы указать, сколько строк должно отображаться. head -n 23 - прочитать файл от начала 23 строчки |
tail
1 2 3 4 |
tail - печатает последние десять строк файла или потока. Используйте опцию -n, чтобы указать, сколько строк должно отображаться. tail -n 23 - прочитать файл с конца 23 строчки tail -n0 -f /var/log/syslog - наблюдать за файлом |
expand
1 2 3 |
expand - конвертирует входные символы табуляции в пробелы. Опция -t указывает размер табуляции. expand name.txt - вывести заменив TAB на пробелы |
unexpand
1 2 |
unexpand - конвертирует входные пробелы в символы табуляции. Опция -t указывает размер табуляции. |
cut
1 2 3 4 5 |
cut - используется для извлечения из входного файла или потока, полей разделенных указанным символом. (попробуйте echo 'abc def ghi jkl' | cut -d ' ' -f2,2 прим. пер.) cut - показать содержимое вырезав символы cut -c 1,4,7 name.txt - показать содержимое вырезав символы cat /etc/passwd | cut -f 1,3,6 -d ':' - показать содержимое 1,3,6 столбика вырезав 2,4,5 разделенные символом ':' |
nl
1 2 |
nl - добавляет к каждой входной строке ее номер. Удобно для распечатки. nl 1.txt - вывести и нумеровать строки |
pr
1 2 |
pr - разбивает файл на страницы и нумерует их; обычно используется для печати. pr 1.txt - покажет как будет выглядеть документ при печате на принтере |
tr
1 2 3 4 |
tr - трансформация текста в файле tr - инструмент трансляции (преобразования) символов; используется для отображения определенных символов во входном потоке на заданные символы в выходной поток. |
sed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
sed - мощный потоко-ориентированный текстовый редактор. Обычно используется с cat sed '/ *#/d; /^ *$/d' - удаление комментариев и пустых строк sed '/^ $/d' - удаление пустых строк sed 's/^[ \t]*//' - удалить все пробелы и символы табуляции в начале каждой строки файла (смотрите примечание по табуляции в конце документа) sed 's/foo/bar/' (замена только первого совпадения в строке) - поиск и замена "foo" на "bar" в каждой строке sed 's/foo/bar/4' (замена первых 4рех совпадений в строке) - поиск и замена "foo" на "bar" в каждой строке sed 's/foo/bar/g' (замена ВСЕХ совпадений в строке) - поиск и замена "foo" на "bar" в каждой строке sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' (замена предпоследнего совпадения) - поиск и замена "foo" на "bar" в каждой строке sed 's/\(.*\)foo/\1bar/' (замена только последнего совпадения) - поиск и замена "foo" на "bar" в каждой строке cat new.txt | sed '/ *#/d; /^ *$/d' > newfile - удаление комментариев и пустых строк cat filename.txt | sed '/^ $/d' > newfile - удаление пустых строк cat ~/.ssh/known_hosts | sed "[nomer_stroki_1],[nomer_stroki_2]d" > ~/.ssh/known_hosts - удаление строк(и) из файла с заранее известным номером cat file.name.txt | sed 's/ *$//' > file.txt - удалить все пробелы в конце каждой строки. sed -r '/(^#.*$)|(^[0-9a-zA-Z\.\:\/\-]+(\.ru\/?)[a-zA-Z0-9\/\-\?\,\]*$)/!{s/^/#/}' text.txt > newtext.txt - все что не соответствует шаблону будет закомментировано sed -i '1 i 000' file - добавить нужную строку в файл cat rasilka.csv | sed 's/ //g' | sed 's/-//g' | sed 's/-//g' | sed 's/(//' | sed 's/)//g' | sed 's/+//g' | sed 's/,/ /g' > rasilka.csv.edit |
awk
1 |
awk - искуссный язык построчного разбора и обработки входного потока по заданным шаблонам. |
od
1 |
od - разработан для представления входного потока в восьмеричном, шестнадцатеричном и т.д. формате. |
split
1 2 3 |
split - эта команда используется для разделения больших файлов на несколько небольших, более управляемых частей. split -b 1M filemy - разбить filemy на части размером 1 Мб с помощью опции -b split -n 3 filemy - разрезание filemy на три части |
fmt
1 2 3 |
fmt - используется, чтобы выполнить «перенос» длинных строк текста. Сегодня она не очень полезна, поскольку эта возможность встроена в большинство текстовых редакторов, хотя команда достаточно хороша, чтобы ее знать. |
paste
1 2 3 |
paste - принимает два или несколько файлов в качестве входных данных, объединяет построчно и выводит результат. Может быть удобно для создания таблиц или колонок текста. paste 1.txt 2.txt - объединить два файла построчно |
join
1 2 |
join - похожа на paste, эта утилита позволяет объединять два файла по общему полю (по-умолчанию первое поле в каждой строке). |
tee
1 2 |
tee - печатает входные аргументы в файл и на экран одновременно. Это полезно, когда вы хотите создать лог для чего-либо, а также хотите видеть процесс на экране. |
Как вставить текст в нужное место файла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Нашей задачей будет вставка всего содержимого текстового файла в нужную строку и графу другого текстового файла. Если нужно просто вставить текст после определенной строки, то с этим справится несколько команд Linux. Например, чтобы вставить содержимое файла file1.txt после второй строки файла file2.txt, подойдет любая из команд: $ sed -i '2r file1.txt' file2.txt $ awk '{print} NR==2 {while (getline < "file1.txt") print}' file2.txt В отличие от команды sed, которая внесет изменения в файл file2.txt, команда awk выдаст результат на стандартный вывод (Stdout); при желании его можно переадресовать в новый файл. Это удобнее, когда не нужно изменять исходный файл. $ emacs -batch +3 file2.txt --insert file1.txt -f save-buffer -kill В этом заклинании используется функция batch (группирование, пакетирование) редактора emacs. Команда открывает file2.txt на строке 3, вставляет file1.txt, сохраняет и потом закрывается. Изменения, таким образом, вносятся непосредственно в file2.txt. $ vi +2 file2.txt << DELIM > :r file1.txt > :wq > DELIM Vim: Warning: Input is not from a terminal Необходимо пояснить, что в командную строку вы вводите только первую строку: $ vi +2 file2.txt << DELIM и нажимаете ENTER. Все последующие строки вы вводите уже в строку приглашения редактора vi, которая начинается со знака >. В распоряжении Linux много утилит для работы с текстом (sed, perl, awk, cut, python), но для выполнения второй части задания — поместить вставку не только в нужную строку, но и в нужную колонку текста, я не придумал ничего удобнее emacs: $ emacs -batch -Q +2:3 file2.txt --insert file1.txt -f save-buffer -kill 2>/dev/null Секрет в цифрах +2:3, которые приказывают редактору открыть вторую строку и 3 столбец. Еще несколько объяснений по поводу данной команды. Опция -Q означает быстрое открытие файла. Быстрое потому, что, по умолчанию, emacs не откроет ни init, ни splash файлы. И еще: выражение в конце команды 2>/dev/null переадресует все сообщения редактора в файл /dev/null, то есть не выводит их на экран монитора. Команды sed, awk или perl могут справиться с поставленной задачей |
split или как мы вставляли нужную надпись между строк (не было ни sed nano т.д.):
1 2 3 4 5 6 |
1. cp my.txt my.txt.back допустим нам над вставить фразу между строк 599 и 600 cat my.txt |wc -l так мы узнаем сколько там всего строк (если нужно) 2. split -l 599 my.txt (файл разделиться) 3. echo "нужная фраза" >> ma.txt ( где ахх это первая половина с 599 строками) 4. cat ma.txt mb.txt >> new.txt (собрали обратно с нужной фразой между 599 и 600 строками) |
tr столбец в строку
1 |
cat /var/db/repos/gentoo/profiles/use.desc | awk '{print $1 " " }' | tr -d '\n' |