Рубрики
разное Текст \ Файлы \ Папки

bash / sed / cut / awk / tr / cat / echo / comm / grep / paste / sort / работаем с текстом

Кусок файла примера zxc1.csv:

name;date;ip;allow;blok
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.4;yes;no
printer;15;192.168.0.4;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.7;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.7;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.7;yes;no
printer;15;192.168.0.1;yes;no
printer;15;192.168.0.1;yes;no

Решение:
cat zxc.csv | cut -f 3 -d";" | sort | uniq
awk -F ';' '{ print $1,$3 }' zxc.csv  | sort | uniq 

Кусок файла примера zxc1.csv:

Алексей,+2 (522) 7234-246-57
Александр,+3 (234944) 123-73-33
Ярослав,+4 (455) 62205-111-87
Максим,+5 (315) 51014-656-923
Дмитрий,+6 (2062) 6434-994-2983
Алексей,+7 (927435) 40302-1945-39844

Решение:
cat zxc1.csv  | sed 's/ //g' | sed 's/-//g' | sed 's/(//' | sed 's/)//g' | sed 's/+//g' | sed 's/,/ /g'
cat zxc1.csv  | sed -e '{s/-//g}'  -e '{s/(//g}' -e 's/)//g' -e '{s/+//g}' -e '{s/ //g}' -e '{s/,/ /}'

Примеры sed

sed 's/string1/string2/g' example.txt - заменить string1 на string2 в файле example.txt и вывести содержимое
sed '/ *#/d; /^$/d' example.txt - удалить пустые строки и комментарии из файла example.txt
sed '/^$/d' example.txt - удалить пустые строки и комментарии из файла example.txt
sed '/serv*/a\ \'  - добавить пустую строку после слова serv
sed 's/serv/\nserv/' - добавить строку перед словом serv 

sed -n '/string1/p' - отобразить только строки содержащие string1
sed -n '5p;5q' example.txt - вывести пятую строку
sed -n '2,5p' example.txt - вывести строки со второй по пятую

sed -e '1d' exampe.txt - удалить первую строку из файла example.txt
sed -e 's/string//g' example.txt - удалить строку string1 из текста файла example.txt не изменяя всего остального
sed -e 's/ *$//' example.txt - удалить пустые символы в конце каждой строки файла example.txt
sed -e 's/00*/0/g' example.txt - Заменить последовательность из любого количества нулей одним нулём



Примем убираем пробелы, знаки"()+-", в конце знак "," заменяем на пробел:
cat zxc1.csv  | sed 's/ //g' | sed 's/-//g' | sed 's/(//' | sed 's/)//g' | sed 's/+//g' | sed 's/,/ /g' > rasilka.csv.edit
Используем специальный ключ "-e" убираем пробелы, знаки"()+-", в конце знак "," заменяем на пробел
cat zxc1.csv | sed -e 's/ //g' -e 's/-//g' -e 's/(//g' -e 's/)//g' -e 's/+//g' -e 's/,/ /g'

sed - пример шаблонов
---------------------
8d - удалить 8-ю строку
/^$/d -	удалить все пустые строки
1,/^$/d	- удалить все строки до первой пустой строки, включительно
/Jones/p - вывести строки, содержащие "Jones" (с ключом -n)
s/Windows/Linux/ - в каждой строке, заменить первое встретившееся слово "Windows" на слово "Linux"
s/BSOD/stability/g - в каждой строке, заменить все встретившиеся слова "BSOD" на "stability"
s/ *$//	- удалить все пробелы в конце каждой строки
s/00*/0/g - заменить все последовательности ведущих нулей одним символом "0"
/GUI/d - удалить все строки, содержащие "GUI"
s/GUI//g - удалить все найденные "GUI", оставляя остальную часть строки без изменений
's/:.*//' - удалить от все последующие символы после двоеточия(:)
--------------------

echo

echo a b c | awk '{print $1,$3}' - вывести первую и третью колонки. Разделение, по-умолчанию, по пробельным символам или символу табуляции
echo a b c | awk '{print $1}' - вывести первую колонку содержимого файла. Разделение, по-умолчанию, по пробельным символам или символу табуляции
echo 'word' | tr '[:lower:]' '[:upper:]' - перевести символы нижнего регистра в верхний

comm

comm -3 file1 file2 - сравнить содержимое двух файлов, удаляя строки встречающиеся в обоих файлах
comm -1 file1 file2 - сравнить содержимое двух файлов, не отображая строки принадлежащие файлу file1
comm -2 file1 file2 - сравнить содержимое двух файлов, не отображая строки принадлежащие файлу file2

grep

grep [0-9] /var/log/messages - отобрать и вывести строки содержащие цифровые символы из файла /var/log/messages
grep ^Aug /var/log/messages - отобрать и вывести строки, начинающиеся с сочетания символов "Aug", из файла /var/log/messages
grep Aug /var/log/messages - отобрать и вывести строки, содержащие сочетание символов "Aug" из файла /var/log/messages
grep Aug -R /var/log/* - отобрать и вывести строки, содержащие сочетание символов "Aug", из всех файлов, расположенных в директории /var/log и ниже
grep шаблон путь_к_файлу - поиск в файле по шаблону
grep "что" "Где" - искать в файле 
grep -nri 'foobar' * - найти по папкам данное слово и вывести номер строки и путь до файла
grep -Er "что" *  - искать что во всех файлах и каталогах
grep -Eri "что" "Где" - искать что во всех файла и каталогах игнорируя регистр
grep -ri "что_ищем" * - поиск в файлах "что_ищем" в  текущем каталоге рекурсивно
grep -riv  "что_ищем" * -  показать все файлы кроме "что_ищем"
grep -v '^#' configfile | cat -s > nocomments - прочитать файл удалив строки с комментариями и сохранив в файл  nocomments
grep -irns "что_ищем" - будет искать начиная с текущего каталога, покажет имя файла и строку
grep -vE "Id|^$|---"  - исключит строки Id, пустые строки(^$) и исключить строки (---)
cat filename | grep -vE "^#|^$" - смотрим конфиги без комментариев (^#) и пустых строк (^$)
ls -la | grep -E "file1|file2" - показать file1 и file2 
cat file | grep -iE "(one|two|three)" - отфильтровать строки без учёта регистра, содержащие одно из слов one, two, three

paste

paste -d '+' file1 file2 - объединить содержимое file1 и file2 в виде таблицы с разделителем "+"
paste file1 file2 - объединить содержимое file1 и file2 в виде таблицы: строка 1 из file1 = строка 1 колонка 1-n, строка 1 из file2 = строка 1 колонка n+1-m

sdiff

sdiff file1 file2 - сравнить содержимое двух файлов

sed

sed 's/string1/string2/g' example.txt - заменить string1 на string2 в файле example.txt и вывести содержимое
sed '/ *#/d; /^$/d' example.txt - удалить пустые строки и комментарии из файла example.txt
sed '/^$/d' example.txt - удалить пустые строки и комментарии из файла example.txt
sed -e '1d' exampe.txt - удалить первую строку из файла example.txt
sed -n '/string1/p' - отобразить только строки содержащие string1
sed -e 's/string//g' example.txt - удалить строку string1 из текста файла example.txt не изменяя всего остального
sed -e 's/ *$//' example.txt - удалить пустые символы в конце каждой строки файла example.txt
sed -n '5p;5q' example.txt - вывести пятую строку
sed -n '2,5p' example.txt - вывести строки со второй по пятую
sed -e 's/00*/0/g' example.txt - Заменить последовательность из любого количества нулей одним нулём

Кусок файла примера rasilka.csv для sed:
Алексей,+2 (522) 7234-246-57
Александр,+3 (234944) 123-73-33
Ярослав,+4 (455) 62205-111-87
Максим,+5 (315) 51014-656-923
Дмитрий,+6 (2062) 6434-994-2983
Алексей,+7 (927435) 40302-1945-39844

Примем убираем пробелы, знаки"()+-", в конце знак "," заменяем на пробел:
cat rasilka.csv  | sed 's/ //g' | sed 's/-//g' | sed 's/(//' | sed 's/)//g' | sed 's/+//g' | sed 's/,/ /g' > rasilka.csv.edit
Используем специальный ключ "-e" убираем пробелы, знаки"()+-", в конце знак "," заменяем на пробел
cat rasilka.csv | sed -e 's/ //g' -e 's/-//g' -e 's/(//g' -e 's/)//g' -e 's/+//g' -e 's/,/ /g'

sed - пример шаблонов
---------------------
8d - удалить 8-ю строку
/^$/d -	удалить все пустые строки
1,/^$/d	- удалить все строки до первой пустой строки, включительно
/Jones/p - вывести строки, содержащие "Jones" (с ключом -n)
s/Windows/Linux/ - в каждой строке, заменить первое встретившееся слово "Windows" на слово "Linux"
s/BSOD/stability/g - в каждой строке, заменить все встретившиеся слова "BSOD" на "stability"
s/ *$//	- удалить все пробелы в конце каждой строки
s/00*/0/g - заменить все последовательности ведущих нулей одним символом "0"
/GUI/d - удалить все строки, содержащие "GUI"
s/GUI//g - удалить все найденные "GUI", оставляя остальную часть строки без изменений
--------------------

sort

sort file1 file2 - вывести отсортированное содержимое двух файлов
sort file1 file2 | uniq - вывести отсортированное содержимое двух файлов исключая повторные значения
sort file1 file2 | uniq -u -вывести уникальные значения из отсортированного содержимого двух файлов 
sort file1 file2 | uniq -d - вывести только повторяющиеся значения из отсортированного содержимого двух файлов 

Примеры работы с cut, sort, unic, sed, awk, tr


cat -n file1  - вывести содержимое файла, нумеруя выводимые строки
cat example.txt | awk 'NR%2==1' - вывести только не четные строки файла


cat zxc.csv | cut -f 3 -d";" | sort | uniq

Поясним про (cut -f 3 -d";") в данном примере: 
(-f 3) выбор столбца 3
(-d";")  выбор разделителя (;)
Поясним про (sort), он не обходим что бы работа (uniq) была выполнена правильно 
Поясним про unic - покажет уникальные значения

cat zxc.csv | sort | uniq | cut -d ";" -f1,3 | sed "s/;/ /g"
Поясним про (sort) - выполняет сортировку
Поясним про (unic) - покажет уникальные значения
Поясним про (cut -d ";" -f1,3) в данном примере: 
(-f1,3) выбор столбца 3,4
(-d";")  выбор разделителя (;)
Поясним про (sed "s/;/ /g"), тут выполняется поиск символа ";" и замена на символ пробела " "

cat zxc.csv | sort | uniq | cut -d ";" -f1,3 | sed "s/;/ /g" > zxc2.txt - выполняем  (sort,unic,cut,sed) и сохранение в файл zxc2.txt

sed -i 's/printer/robot/g' zxc2.txt - ищем в файле (zxc2.txt) слово (printer) меняем его на (robot)
sed -i 's/robot/slon/1' zxc2.txt - ищем в файле (zxc2.txt) слово (robot) меняем его на (slon)

awk -F ';' '{ print $1,$3 }' zxc.csv  | sort | uniq - с помощью (awk -F ';' '{ print $1,$3 }' zxc.csv ) выводим на экран 1 и 2 столбцы из файла zxc.csv, сортируем, показываем уникальные строки 


cat zxc.csv | sed -e 's/;/ /g' | cut -d ' ' -f 1,3  | sort | uniq

cat zxc.csv | awk -F';' '{print $1,$3}' | sort | uniq

cat zxc.csv | sed -e 's/;/ /g' | cut -d ' ' -f 1,3  | sort | uniq

cat zxc1.csv  | sed -e '{s/-//g}'  -e '{s/(//g}' -e 's/)//g' -e '{s/+//g}' -e '{s/ //g}' -e '{s/,/ /}'

cat zxc.csv  | awk -F ';' '{print $1,$3}' | sort | uniq

cat zxc.csv | cut -f 1,3 -d ';' | sed 's/;/ /g' | sort | uniq

cat zxc.csv | cut -f 1,3 -d ';' | tr ';' ' ' | sort | uniq

history | cut -c 8-120

ps -uax | awk -F ' ' '{print $1,$2,$11}'

ls -latr | awk -F ' ' '{print $3,$9}'

ls -hlatr | awk -F ' ' '{print $5,$3,$9}' | grep M | sort -u

Регистр:

echo 'word' | tr '[:lower:]' '[:upper:]' - перевести символы нижнего регистра в верхний
echo 'word' | tr '[:upper:]' '[:lower:]' - перевести символы верхнего регистра в нижний 

Ещё один пример достать нужное

1.txt
-----
mv: cannot stat '/etc/bareos/bareos-dir.d/catalog': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/director': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/messages': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/user': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/fileset': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/client': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/job': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/jobdefs': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/pool': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/schedule': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/storage': No such file or directory
mv: cannot stat '/etc/bareos/bareos-dir.d/use': No such file or directory
----

Достаем серединку:
cat 1.txt | cut -c `echo "mv: cannot stat " | wc -c`-`echo "mv: cannot stat '/etc/bareos/bareos-dir.d/schedule':"| wc -c` | sed -e "s/'//g" -e 's/:.*//'

cat 1.txt | cut -d "'" -f 2
cat 1.txt | awk -F"'" {print $2}



awk вставка текста в начало / конец строки

cat file.txt | awk '{print "xxx " $0}'
cat file.txt | awk '{print $0 " xxx"}'
cat file.txt | awk '{print "xxx " $0 " xxx"}'

cat file.txt | awk '{print $1}' | awk '{print "xxx " $0}'

AWK. Пример с пингом

Пингуем хосты с помощью программы fping и результат записываем в файл test_ping.txt
for x in `seq 2 254`; do fping -c1 192.168.1.${x}; done >> test_ping.txt
Парсим файл и там где хост пинговался в вывод добавляем ok.
cat test_ping.txt | awk "/ 0% loss/" | awk -F ':'  '{print $1 "ok"}'

sed еще примеры:

sed -n /root/p /etc/passwd - вывести строку содержавшие слово root, работает аналогично "grep root /etc/passwd"
sed 10q /etc/passwd - вывести первых 10 строк, работает аналогично head
sed -i.orig s/^alias/#alias/ file_name - заменить все строки которые начинаются на слово alias на #alias, при этом будет создана резервная копия file_name.orig
sed -i.orig /^alias/s/^/#/ - сначала ищем все слова которые начинаются на alias, потом заменяем символ начало строки "^" на решётку "#" 
sed -e /^#/d -e '/^$/d' file_name - показываем файл без комментариев и пустых строк

awk (оук?) еще примеры:

awk '{print "Hello"}' - если дальше продолжать нажимать Enter, то будет выводится Hello


Чем отличается перенаправление в cat
"EOF" - слова на которое завершится вставка текста
cat << "EOF" > filename1 - при такой передаче есть возможность использовать и передавать переменные bash как своим так и встроенные  $1,$2, $?, $i
cat  > filename1 << "EOF" - такая конструкция исключает передачу переменных, файл будет передан как есть 

Пример создаём файл filename1
cat << "EOF" > filename1
{
Hello
}
EOF
awk -f filename1 - открыв таким образом файл filename1 и если там будет скрипт выше, то мы получим эффект команды awk '{print "Hello"}'


awk /^root/{print} /etc/passwd - аналогично grep, покажет строку которая содержит слово root
ip a | awk /link/{print} - напечатать строку которая содержит слово link
ip a | awk '{print}NR==3{exit}' - напечатать 3 строки, аналогично "ip a |head -n 3"
ip a | awk 'END{print NR}' - аналогично команды "ip a | wc -l"
ip a | awk '{print $2}' - вывести второй столбец
ip a | awk '/^4/{print $1}' - вывести из первого столбца то что начинается на 4


Немного про спец символы в awk
$0 - весь файл (в баше это сам файл)
$1 - первый аргумент, выведет слова первой строки
...
$9 - девятый аргумент, выведет слова девятой строки
awk '{print $0}' /etc/passwd - будет выведен весь файл, эффект как от cat /etc/passwd
awk -F:  '{print $1,$3}' /etc/passwd - выведет первый и 3 столбик из файла 
awk -F: '/root/{print $1, $4, $7}' /etc/passwd - найти строку содержанию слово root и вывести 1,4,7 столбики

Пример с заменой
echo "one two tree nice 1" | awk '{$1="1"; $3="3"; $5="five"; print $0}'

Параметры BEGIN и END
Пример скрипта для awk
cat > filetest << "EOF"
BEGIN { print "Start" }
{print $1}
END { print "The end" }
EOF
Пример использования скрипта выше:
awk -F: -f filetest /etc/passwd

Еще один пример с BEGIN и END
FS: аналог awk -F:
awk 'BEGIN { print  "login \t home"; FS=":"} {print $1 "\t" $6} END {print "END file"}' /etc/passwd

Еще один пример BEGIN и END с заменой разделителя ":" на "%"
awk 'BEGIN{FS=":"; OFS="%"} {print $1, $4, $3}' /etc/passwd


Элементы ARGC(C- коунтер) и ARGV(V- валею) 
awk 'BEGIN{print ARGC, ARGV[0]}'
awk 'BEGIN{print ARGC, ARGV[1]}' /etc/passwd
awk 'BEGIN{print ARGC, ARGV[1], ARGV[0]}' /etc/passwd

Элемент ENVIRON
env - тут можно увидеть все текущие переменные
awk 'BEGIN{print ENVIRON["HOME"]}'
awk 'BEGIN{print ENVIRON["PATH"]}'

awk \ условия \ циклы \ if \ else \ for

Пример if для awk
cat > test << "EOF"
{
if ($1 < 2)
{
print 1
}
else if ($1 < 22)
{
print 2
}
else
{
print 0
}
}
EOF
Используем:
awk -f test - ну и вводим наше число и получаем результат

Пример for
awk 'BEGIN{ for (i=1; i<11; i++){print i}}'
awk 'BEGIN{ for (i=1; i<11; i++){if(i==5) break; print i}}'
awk 'BEGIN{ i=10 ; while (i>0){ print i; i-- }}'