Программирование в стандарте POSIX

txt cat


cat f1.txt - f2.txt - f3. txt cat g1.txt - g2.txt - g3.txt < input.txt cat g1.txt - g2.txt /dev/null g3.txt < input.txt cat f1.txt f2.txt > f1.txt
Листинг 6.1. Пример использования утилиты cat.
Закрыть окно




od -A x -t a ascii.tab
Листинг 6.2. Пример использования утилиты od.
Закрыть окно




000000 nul soh stx etx eot enq ack bel bs ht nl vt ff cr so si 000010 dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us 000020 sp ! " # $ % & ' ( ) * + , - . / 000030 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 000040 @ A B C D E F G H I J K L M N O 000050 P Q R S T U V W X Y Z [ \ ] ^ _ 000060 ` a b c d e f g h i j k l m n o 000070 p q r s t u v w x y z { | } ~ del 000080
Листинг 6.3. Возможный результат использования утилиты od.
Закрыть окно






echo " Reloading automounter: checking\ for changes ... " TMP=/var/run/autofs.tmp getmounts > $TMP for i in /var/run/autofs.*.pid do pid=`head -n 1 $i 2>/dev/null` [ "$pid" = "" ] && continue command=`tail -n +2 $i` if ! grep -q "^$command" $TMP then echo "Stopping automounter: $command" kill -USR2 $pid fi done rm -f $TMP
Листинг 6.4. Пример использования служебных программ head и tail.
Закрыть окно




2003-10-17 17:24 Список файлов каталога /var/tmp Page 1 1 . 2 .. 3 Blank.ReS 4 Make45.ReS 5 Make46.ReS 6 from_cvs 7 gcc-20032204 8 gcc-3.4-16-jun-2003 9 htdocs 10 rpm-tmp.29785 . . .
Листинг 6.5. Начальный фрагмент возможного результата работы служебной программы pr.
Закрыть окно




wc ascii.od
Листинг 6.6. Пример использования утилиты wc.
Закрыть окно




9 137 575 ascii.od
Листинг 6.7. Возможный результат использования утилиты wc.
Закрыть окно




12.05.2000 17: 30 200 125 120 15.05.2000 17:00 130 80 70 17.05.2000 10:30 150 90 70 17.05.2000 21:45 154 99 74 19.05.2000 10:05 158 83 89 21.05.2000 21:00 161 104 64 22.05.2000 21:00 147 104 69 . . .
Листинг 6.8. Пример исходных данных для служебной программы sort.
Закрыть окно




sort -r -k 3,3 pp.txt
Листинг 6.9. Пример использования служебной программы sort.
Закрыть окно




12.05.2000 17:30 200 125 120 18.11.2000 19:30 172 107 68 04.07.2002 09:00 170 98 85 30.10.2001 13:00 168 94 88 27.12.2000 20:30 166 98 69 23.05.2002 10:00 166 104 56 22.05.2002 10:00 166 103 57 23.10.2001 11:00 165 88 88 . . .
Листинг 6.10. Возможный результат работы служебной программы sort.
Закрыть окно




# Первый вариант - ключ сортировки покрывает # несколько полей sort -r -k 3,5 pp.txt # Второй вариант - используется несколько # ключей сортировки # sort -n -r -k 3,3 -k 4,4 -k 5,5 pp.txt
Листинг 6.11. Два варианта использования служебной программы sort.
Закрыть окно




12.05.2000 17:30 200 125 120 18.11.2000 19:30 172 107 68 04.07.2002 09:00 170 98 85 30.10.2001 13:00 168 94 88 23.05.2002 10:00 166 104 56 22.05.2002 10:00 166 103 57 27.12.2000 20:30 166 98 69 23.10.2001 11:00 165 88 88 . . .
Листинг 6.12. Результат работы служебной программы sort с несколькими ключами сортировки.
Закрыть окно




# Первый вариант слияния файлов # sort -m -o pp.sorted -n -r -k 3,3 -k 4,4 # -k 5,5 pp2*.sorted # Второй вариант слияния файлов > pp.sorted for f in pp2*.sorted do sort -m -o pp.sorted -n -r -k 3,3\ -k 4,4 -k 5,5 $f pp.sorted done
Листинг 6.13. Два варианта слияния файлов с помощью служебной программы sort.
Закрыть окно




name=pp.sorted if sort -c -r -n -k 3,3 -k 4,4 -k 5,5 $name then echo Данные в файле $ name отсортированы\ верно elif echo Данные в файле $name отсортированы\ неверно fi
Листинг 6.14. Проверка правильности упорядоченности строк в файле с помощью служебной программы sort.
Закрыть окно




sort -k 2.2b,2. 2b f1 f2
Листинг 6.15. Пример использования служебной программы sort с модификаторами в определении ключей.
Закрыть окно




sort -t ':' -k 3,3n /etc/passwd
Листинг 6.16. Пример использования служебной программы sort с опцией -t.
Закрыть окно




sort -um -k 3.1,3 f.sorted
Листинг 6.17. Пример использования служебной программы sort с опциями -m и -u.
Закрыть окно




diff -r binutils-2_14 binutils-2_14-branch
Листинг 6.18. Пример использования служебной программы diff.
Закрыть окно




diff -r binutils-2_14/bfd/version.h binutils-2_14-branch/bfd/version.h 1c1 < #define BFD_VERSION_DATE 20030612 --- > # define BFD_VERSION_DATE 20031007 Only in binutils-2_14-branch/binutils: ChangeLog Only in binutils-2_14-branch/binutils: arlex.c Only in binutils-2_14-branch/binutils: deflex.c Only in binutils-2_14-branch/binutils: rclex.c Only in binutils-2_14-branch/binutils: syslex.c Only in binutils-2_14-branch: config.guess Only in binutils-2_14-branch/gas: ChangeLog Only in binutils-2_14-branch/gas/config: tc-ns32k.c Only in binutils-2_14-branch/gas: configure Only in binutils-2_14-branch/gas: configure.in Only in binutils-2_14-branch/gas: itbl-lex.c . . .
Листинг 6.19. Фрагмент возможного результата работы служебной программы diff.
Закрыть окно




cmp -l binutils-2_14/bfd/version.h\ binutils-2_14-branch/bfd/version.h
Листинг 6.20. Пример использования служебной программы cmp.
Закрыть окно




30 60 61 31 66 60 32 61 60 33 62 67
Листинг 6.21. Возможный результат работы служебной программы cmp.
Закрыть окно




comm - 12 xpg3 svid89 | comm -23 - xcu
Листинг 6.22. Пример использования служебной программы comm.
Закрыть окно




map=`basename $map | sed -e s/^auto_home/auto.home/ -e s/^auto_mnt/auto.mnt/` cat /etc/auto.master | grep -v '^+' | sed -e '/^#/d' -e '/^$/d'
Листинг 6.23. Пример использования редактора sed.
Закрыть окно




sed -n ' p /^$/ { # Текущая строка - пустая. # Добавляем следующие строки к буферу, # пока он остается пустым. # Тем самым игнорируются "лишние" пустые # строки. :Empty n /^$/ b Empty # Добавленная строка оказалась непустой. # Выведем ее. p } '
Листинг 6.24. Сжатие пустых строк средствами редактора sed.
Закрыть окно




sed -n ' # Выведем непустые строки /./ { p d } # Выведем одну пустую строку, затем # проанализируем следующие. /^$/ p # Прочитаем следующую строку, отбросим # оставшийся перевод строки (пустую строку) # и вернемся к проверке пустой строки. :Empty /^$/ { N s /.// b Empty } # Выведем непустую строку, затем вернемся к # поиску первой пустой. p '
Листинг 6.25. «Стандартный» вариант сжатия пустых строк средствами редактора sed.
Закрыть окно




{ s += $1 } END { print "Сумма:", s, " Среднее арифметическое:", s/NR }
Листинг 6. 26. Пример awk-программы, оперирующей с числами.
Закрыть окно




awk '$1 != prev { print; prev = $1 }' f1.txt
Листинг 6.27. Пример awk-программы, заданной в командной строке.
Закрыть окно




/Page/ { $2 = n++ } { print }
Листинг 6. 28. Пример awk-программы, использующей шаблоны.
Закрыть окно




awk -f prog.awk -v 'n=1' f2.txt
Листинг 6.29. Пример вызова awk-программы, использующей шаблоны.
Закрыть окно




{ for (i = NF; i > 0; --i) print $i }
Листинг 6.30. Пример awk-программы, использующей оператор цикла.
Закрыть окно




BEGIN { for (i = 1; i < ARGC; ++i) printf ("%s%s", ARGV [i], i == ARGC - 1 ? "\n" : " ") }
Листинг 6.31. Пример awk-программы, использующей оператор цикла и специальные переменные awk.
Закрыть окно




BEGIN { n = split (ENVIRON ["PATH"], path, ":") for (i = 1; i <= n; ++i) print path [i] }
Листинг 6.32. Пример awk-программы, использующей встроенную функцию split().
Закрыть окно




# Перемонтируем на чтение все, что еще остается смонтированным. mount | awk '/( \/ |^\/dev\/root)/ { print $3 }' | while read line; do mount -n -o ro,remount $line done
Листинг 6.33. Пример использования утилиты awk в системном командном файле.
Закрыть окно




#include <regex.h> int regcomp (regex_t *restrict preg, const char *restrict pattern, int cflags); int regexec (const regex_t *restrict preg, const char * restrict string, size_t nmatch, regmatch_t pmatch [restrict], int eflags); void regfree (regex_t *preg); size_t regerror (int errcode, const regex_t *restrict preg, char *restrict errbuf, size_t errbuf_size);
Листинг 6.34. Описание функций семейства regex().
Закрыть окно




#include <stdio.h> #include <limits.h> #include <regex.h>
/* Программа ищет все вхождения заданного шаблона во всех входных строках */ /* и выводит успешно сопоставленные подцепочки */
#define PATTERN "[A-Za-z][A-Za-z0-9]{0,31}"
int main (void) { char line [LINE_MAX]; /* Буфер для входных строк */ char *pline; /* Указатель на начало сопоставляемой части строки */ regex_t cere; /* Скомпилированное расширенное регулярное выражение */ regmatch_t pm; /* Структура для запоминания границ сопоставленной подцепочки */ int reerrcode; /* Код ошибки от regcomp или regexec */ char reerrbuf [LINE_MAX]; /* Буфер для строк с сообщениями об ошибках */ int i;
if ((reerrcode = regcomp (&cere, PATTERN, REG_EXTENDED)) != 0) { (void) regerror (reerrcode, &cere, reerrbuf, sizeof (reerrbuf)); fputs (reerrbuf, stderr); fputc ('\n', stderr); regfree (&cere); return (reerrcode); }
fputs ("Вводите строки, сопоставляемые с шаблоном " PATTERN "\n", stdout); while (fgets (line, sizeof (line), stdin) != NULL) { /* Произведем первое сопоставление с прочитанной строкой. */ /* Оно отличается от остальных при наличии в шаблоне фиксатора начала */ reerrcode = regexec (&cere, pline = line, 1, &pm, 0); while (reerrcode == 0) { /* Повторяем, пока сопоставления с остатком строки успешны */ fputs ("Сопоставленная подцепочка: ", stdout); for (pline += pm.rm_so, i = pm.rm_eo - pm.rm_so; i-- > 0; ) { fputc (*pline++, stdout); } fputc ('\n', stdout); reerrcode = regexec (&cere, pline, 1, &pm, REG_NOTBOL); } }
regfree (&cere); return (ferror (stdin) || ferror (stdout)); }
Листинг 6.35. Пример использования функций семейства regex().
Закрыть окно




tr -cs '[:alpha:]' '[\n*]' < f1 > f2
Листинг 6.36. Пример использования служебной программы tr.
Закрыть окно




tr -s '[:upper:]' '[:lower:]'
Листинг 6.37. Пример трансляции и сжатия последовательностей символов с использованием служебной программы tr.
Закрыть окно




find /usr/include -name '*.h' - exec cat {} \; | tr -d '[:blank:]' | \ grep -E -e '^#include(<.*>|".*")' | sort | uniq -dc | sort -r | head
Листинг 6.38. Пример использования служебной программы uniq.
Закрыть окно




977 #include"nsISupports.h" 315 #include<glib.h> 201 #include<gdk/gdk.h> 167 #include<glibmm.h> 160 #include<features.h> 154 #include<glib-object.h> 144 #include"nsCOMPtr.h" 139 #include<sys/types.h> 139 #include<glibmm/class.h> 135 #include"nscore.h"
Листинг 6.39. Возможный результат работы конвейера, показанного в листинге 6.38.
Закрыть окно




cut -d : -f 1,3 /etc/passwd
Листинг 6.40. Пример использования служебной программы cut.
Закрыть окно




root:0 bin:1 daemon:2 adm:3 lp:4 sync:5 . . .
Листинг 6.41. Начальный фрагмент возможного результата работы служебной программы cut.
Закрыть окно




ls | paste - - - -
Листинг 6.42. Пример использования служебной программы paste.
Закрыть окно




paste -s -d "\0\n" f.txt
Листинг 6.43. Пример использования служебной программы paste с кольцевым списком разделителей.
Закрыть окно




cut -b 1-80 -n f > f1. txt cut -b 81- -n f > f2 . . . paste -d '\0' f1.txt f2 > f3
Листинг 6.44. Пример использования служебных программ cut и paste.
Закрыть окно




join -1 4 -2 3 -o 1.1,2.1,1.6 -t : passwd.sorted group.sorted
Листинг 6.45. Пример использования служебной программы join.
Закрыть окно




halt:root:/sbin operator:root:/root root:root:/root shutdown:root:/sbin sync:root:/sbin bin:bin:/bin daemon:daemon:/sbin . . .
Листинг 6.46. Начальный фрагмент возможного результата работы служебной программы join.
Закрыть окно




Имя Номер телефона Иван 123-4567 Петр 123-5678 Яков 123-6789
Имя Адрес электронной почты Иван ivan123@mail.ru Олег oleg@yahoo.com Яков yak@yandex.ru
Листинг 6.47. Возможное содержимое двух справочников с информацией о телефонных номерах и об адресах электронной почты.
Закрыть окно




join -t '<tab>' -a 1 -a 2 -e '---------' -o 0,1.2,2.2 phone.txt email.txt
Листинг 6.48. Еще один пример использования служебной программы join.
Закрыть окно




Имя Номер телефона Адрес электронной почты Иван 123-45-67 ivan123@mail.ru Олег --------- oleg@yahoo.com Петр 123-56-78 --------- Яков 123-67-89 yak@yandex.ru
Листинг 6.49. Возможный результат работы служебной программы join.
Закрыть окно




#include <dirent.h> DIR *opendir ( const char *dirname);
Листинг 6.50. Описание функции opendir().
Закрыть окно




#include <dirent.h> void rewinddir (DIR *dirp);
Листинг 6.51. Описание функции rewinddir().
Закрыть окно




#include <dirent.h> struct dirent *readdir (DIR *dirp);
Листинг 6.52. Описание функции readdir().
Закрыть окно




#include <dirent.h> int closedir (DIR *dirp);
Листинг 6.53. Описание функции closedir().
Закрыть окно




#include <fnmatch.h> int fnmatch (const char *file_pattern, const char *file_name, int flags);
Листинг 6.54. Описание функции fnmatch().
Закрыть окно




#include <dirent.h> #include <fnmatch.h> #include <errno.h> #include <stdio.h>
/* Программа сопоставляет имена файлов текущего каталога с заданными шаблонами */
#define SEARCH_DIR "."
static void match_names (DIR *dirp, const char *pattern) { struct dirent *dp;
rewinddir (dirp);
while (errno = 0, (dp = readdir (dirp)) != NULL) { if (fnmatch (pattern, dp->d_name, FNM_PERIOD) == 0) { (void) printf (" %s\n", dp->d_name); } }
if (errno != 0) { perror ("Ошибка при чтении каталога " SEARCH_DIR); } }
int main (int argc, char *argv []) { DIR *dirp; int i;
if ((dirp = opendir (SEARCH_DIR)) == NULL) { perror ("Ошибка при открытии каталога " SEARCH_DIR); return (-1); }
for (i = 1; i < argc; i++) { (void) printf ("Файлы каталога " SEARCH_DIR ", удовлетворяющие шаблону %s\n", argv [i]); match_names (dirp, argv [i]); }
return (closedir (dirp)); }
Листинг 6.55. Пример использования функций, обрабатывающих каталоги.
Закрыть окно




#include <glob.h> int glob (const char * restrict file_pattern, int flags, int (*errfunc) (const char *epath, int eerrno), glob_t *restrict pglob); void globfree (glob_t *pglob);
Листинг 6.56. Описание функций glob() и globfree().
Закрыть окно




#include <glob.h> #include <errno.h> #include <stdio.h>
/* Программа выводит маршрутные имена, сгенерированные по заданным шаблонам */
static int errfunc (const char *epath, int eerrno) { fprintf (stderr, "Ошибка при обработке каталога %s: ", epath); errno = eerrno; perror (NULL); return (0); }
int main (int argc, char *argv []) { glob_t gl_buf; int i;
for (i = 1; i < argc; i++) { (void) glob (argv [i], ((i == 1) ? }
(void) printf ("Маршрутные имена, сгенерированные по заданным шаблонам:\n"); for (i = 0; (unsigned) i < gl_buf.gl_pathc; i++) { (void) printf ("%s\n", gl_buf.gl_pathv [i]); }
globfree (&gl_buf); return (0); }
Листинг 6.57. Пример программы, использующей функции glob() и globfree().
Закрыть окно




if [ "`dirname $RAW`" = "/dev/raw" -a -f /dev/raw ]; then echo $" Please correct your /etc/sysconfig/rawdevices:" echo $" rawdevices are now located in the directory /dev/raw/ " echo $" If the command 'raw' still refers to /dev/raw as a file." echo $" you'll have to upgrade your util-linux package" exit fi
Листинг 6.58. Пример использования служебной программы dirname.
Закрыть окно




gcc -Wall -W -pedantic -o $(basename "$1" .c) $(dirname "$1")/$(basename "$1" .c).c
Листинг 6.59. Пример совместного использования служебных программ basename и dirname.
Закрыть окно



Содержание раздела