Материалы по UNIX

 
     

 

Некоторые команды

pwd сообщает полное имя текущей директории
ls показывает содержимое текущей директории
cp <имя файла 1> <имя файла 2> копирует файл 1 в файл 2
mv <имя файла 1> <имя файла 2> переименовывает файл
mv <имя файла> <имя поддиректории>   перемещает файл в поддиректорию
rm <имя файла> уничтожает файл
mkdir <имя поддиректории> создает поддиректорию
cd <имя поддиректории> переход в поддиректорию
cd .. выход из поддиректории (переход в родительскую директорию)
more <имя файла> просмотр содержимого файла (клавишами "пробел" и "Enter")
man <команда> выдает подробную информацию о команде
(см. также здесь)

Работая в UNIX, необходимо помнить о различии формата текстовых файлов между UNIX и Windows. В Windows признаком конца строки служит пара байтов с шестнадцатиричными кодами 0D и 0A, идущих друг за другом. В UNIX эту роль выполняет один байт 0A. В результате программы UNIX воспринимают символ 0D (так называемый "carriage return" — "возврат каретки") как обычный символ, что приводит к особенно неприятным последствиям в скриптах. К счастью, редактор Far manager'а может сохранить ваш текстовый файл в любом формате, для чего служит функция "сохранить как": <Shift+F2>.

Стандартные потоки

Каждое консольное приложение (то есть, попросту говоря, каждая программа, с которой можно работать из командной строки) имеет дело с тремя т.н. потоками: stdin, stdout и stderr.

Поток stdin по-русски называется "стандартный поток ввода" и по умолчанию содержит то, что вы набираете на клавиатуре во время работы программы (например, в ответ на вопросы программы).

Потоки stdout и stderr — это, соответственно, стандартный поток вывода и стандартный поток ошибок, и по умолчанию их содержание отображается в консольном окне. То есть, хотя это два разных потока, различить их при обычной работе программы нельзя. Однако можно перенаправить stdout на stdin другой программы или в файл (см. следующий раздел), при этом stderr будет продолжать выводиться на экран.

Перенаправление вывода

Символ > используется в интерпретаторах командной строки bash и tcsh для перенаправления стандартного вывода (stdout) команды в файл. Например, команда
 ls > cur_dir.txt
приведет к тому, что список файлов текущей директории окажется в файле cur_dir.txt При этом, если файл с таким именем уже существовал, то его старое содержимое исчезнет.

Чтобы дописать stdout команды в конец уже существующего файла, используется сочетание символов >>. Например, команда

 cat file2.txt >> file1.txt
приведет к тому, что в файле file1.txt после его старого содержимого окажется еще и содержимое файла file2.txt (что делает команда cat, тем самым нетрудно догадаться).

Чтобы записать в файл stderr команды, в bash можно применить сочетание символов 2>, например:

 entret -help 2> entret.help
(entret, как и другие программы пакета EMBOSS, выдаёт свой help на stderr).

В tcsh сочетание 2> не действует, зато сочетание >& направляет в файл и stdout, и stderr.

Для направления stdout одной команды на вход (stdin) другой команды используется "pipe" (конвейер), задаваемый знаком | , например:

 ls -l | more
позволяет просмотреть программой more информацию о файлах в текущей директории.

К сожалению, в bash нет простого способа направить в конвейер stderr, равно как и добавить stderr в конец существующего файла. Если такое очень нужно, придется поменять интерпретатор, выполнив команду

tcsh
а затем использовать сочетания  |&  (для конвейера stderr → stdin) и  >>&  (для добавления stderr в конец файла). Чтобы потом вернуться в bash, достаточно выполнить команду exit.

Спецсимволы bash

Ряд символов вопринимается интерпретатором командной строки bash не буквально, а как указания произвести некоторые операции. Это следующие символы:
пробел (а также табулятор и перенос строки);
кавычки (" и '), обратная косая черта ( \ )
*  ?  [  ]  {  } 
>  <  |  ;  & 
$  !  (  ) ` ~ #

Пробел и символ табуляции отделяют параметры друг от друга.

Кавычки и обратная косая черта используются для передаче программам параметров, содержащих спецсимволы (например, имен файлов с пробелами).
 – В одинарных кавычках все символы (кроме, естественно, самой одинарной кавычки) воспринимаются буквально.
 – В двойных кавычках символы $ и ` (обратные кавычки) сохраняют специальное значение (вызов содержания переменной и подстановка вывода другой команды соответственно); кроме того, сочетание \$ превращается в (буквальный) символ $, \" — в символ ", а \` — в символ ` (обратная кавычка). Все остальные символы воспринимаются буквально.
 – Сочетание \ с любым символом превращается в этот символ.

Звездочка *, вопросительный знак ? и квадратные скобки [ ] используются для "масок" имен файлов. Например [0-9]* превращается bash-ем в список всех файлов текущей директории, чье название начинается с цифры.

Символы >, < и | предназначены для работы со стандартными потоками (см. выше).

Символ ! можно использовать для вызова команды из журнала команд (просмотреть журнал можно, выполнив команду history).

Пользуясь символом ; (точка с запятой) можно исполнить одной строкой последовательность из двух или более команд — этот символ разделяет строку на последовательно выполняемые команды.

Программа "grep"

Программа grep предназначена для вытаскивания из текстового файла строк, содержащих некоторое слово. Например, если взять файл some.needle, содержащий выдачу программы needle, и написать
grep Identity some.needle
то на экране появится строка файла some.needle, содержащая информацию о проценте совпадений. Выдача идет в stdout, поэтому её легко перенаправить в файл или просмотреть программой more.

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

infoseq "sw:*_bacsu" | grep flagellar
Программа infoseq соберет информацию о записях SwissProt, чье ID кончается на "_bacsu" и выдаст ее на stdout, после этого программа grep отберет из выдачи те строки, которые содержат слово "flagellar". В результате на экране появятся только эти отобранные строки. Можно, разумеется, устраивать и цепочки grep'ов, перенаправляя вывод одного grep'а на вход другого.

Задавать слово для поиска можно не только однозначным образом. Команда grep понимает некоторые спецсимволы, самые употребительные из которых: ^, $, . (точка), *, [ и ], а также \.

  –  точка ставится вместо любого символа, например

grep t..p filename
вытащит из файла filename все строки, в которых встретились буквы t и p с двумя любыми символами между ними;

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

grep tr[iy]psin filename
выдаст все строки из filename, содержащие слова tripsin или trypsin.
grep 'number [0-9]' filename
выдаст все строки из filename, содержащие сочетания "number 1", "number 2" и т.д. Кавычки в примере стоят, чтобы bash не воспринял "number" и "[0-9]" как отдельные параметры.

  – шапочка ^ и доллар $ означают соответственно начало и конец строки. Например,

grep '^>' filename
выдаст все строки из filename, начинающиеся с символа >

  – звёздочка * означает, что предыдущий символ может быть повторен сколько угодно раз. Например

grep 'number [0-9]* ' filename
выдаст строки с сочетаниями "number 1087 ", "number 99 " и т.п.

  – наконец, \ используется для того, чтобы последующий символ воспринимался программой буквально, например

grep '\.ru' filename
найдет строки, содержащие ".ru" (а не (любой символ)ru, как если бы \ перед точкой не стоял).

Многие спецсимволы grep являются также спецсимволами bash, поэтому (а также, например, для поиска слов, содержащих пробелы) первый параметр программы лучше всегда брать в одинарные кавычки.

Программа grep имеет две важные опции, а именно -v и -c. Опция -v означает, что нужно выдать не строки, содержащие указанное слово, а наоборот, строки его не содержащие. Опция -c означает, что надо выдать лишь число таких строк, а не сами строки.

Online-учебники по UNIX