net4me.net

Linux технологии, сети и электроника

Примеры работы в командной строке linux

Примеры использования linux утилит в различных ситуациях из жизни.
find, mount, rsync, xargs, echo и прочее прочее...
Постараюсь поддерживать порядок, но не обещаю классификации.

AWK tips

Заметки по работе с текстом

AWK

awk '/SIP\/[0-9]{3}+\-[a-z0-9]{8}/ {print $0...}'
egrep --color 'SIP\/[0-9]{3}+\-[a-z0-9]{8}'

# нечетные столбцы:
for X in {1..5}; do for Y in {1..10}; do echo -n "$Y "; done; echo; done | awk '{for(i=1;i<=NF;i+=2) print $i}' 

# подсчитать суммы по нечётным столбцам
$ for X in {1..5}; do for Y in {1..10}; do echo -n "$Y "; done; echo; done | awk '{print $0} {for(i=1;i<=NF;i+=2) s[i]+=$i} END{for (x in s) {printf "%s\t",s[x]} }'; echo
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 
5	15	25	35	45

# условия при поиске
# OR:
awk '/Install:|Remove:/ {print $0}' /var/log/apt/history.log
awk '/Inst[al:]|Remov[:e]/ {print $0}' /var/log/apt/history.log
awk '/Inst/||/Rem/ {print toupper($0)}' /var/log/apt/history.log
# AND:
awk '/var.*bin.*login/ {print $0}' /etc/passwd

# FS OFS count
awk 'BEGIN{ FS=":"; OFS="\t\t"};{CNT++; print $1,$6,$7};END{print "Count:",CNT}' /etc/passwd

# найти строки, начинающиеся с 6ти цифр (или больше 6) и обрезать вывод до 6ти символов
awk '/^[0-9]{6}/ {print substr($1,0,6)}'

# printf 
awk 'BEGIN{ for (i = 32; i <= 126; ++i) {printf "ASCII dec=%d, hex=%#X, char \"%c\"\n",i,i,i } }'

# FS and split 
awk -F\: '{gsub(" ", "", $2); split($2,o,","); print o[2]}'<<<"example one: two, three, four"
three

# ================ разные варианты awk из жизни =================== 

# поиск многострок по началу и концу (включительно):
cat kakoyto_log | awk '/begin/{a=1} a; /end/{a=0}'
# или с использованием sed:
cat kakoyto_log | sed -n -e '/begin/,/end/{p}'

# первая и три последних строки файла:
echo -e "1\n2\n3\n4\n5\n6" | awk 'NR==1; {ppp=pp;pp=p;p=$0;} END{printf "%s\n%s\n%s\n",ppp,pp,p}'
1
4
5
6
# по сути ppp,pp и p - буферы, в которых мы перемещаем $0 c каждой итерацией строки.

# ================ сравнение двух файлов =================== 

# найти общие строки в двух файлах:
awk 'FNR==NR{obshee[$0]=1; next} obshee[$0]' small.txt big.txt
# или с grep -f
grep -oFf small.txt big.txt
# вывести разницу между двумя файлами (big.txt - small.txt = ):
awk 'FNR==NR{exclude[$0]++; next} !exclude[$0]' small.txt big.txt

grep -c и awk

# Понадобилось получить количество совпадений (grep -c) а файлов много и это архивы и нужна сумма по всем. Куда ж без awk?
zgrep -ic "error" /var/log/*.gz | awk -F: '{SUM+=$2}{print "File="$1,"\tCount="$2,"\tSumNow="SUM} END{print "Total Sum="SUM}'

fzf

#наткнулся на такой поиск по тексту как fzf:
cat /etc/passwd|fzf
fzf -m # множественный выбор tab-ом.
# И такие штуки как рекурсивный поиск и множественный выбор с предпросмотром:
alias fff="ls -laHR | fzf -m --preview='echo user={3} when={-4..-2}; cat {-1}' --header-lines=1 | awk '{print $9}'"

пустые строки в файле


# убрать пустые строки помимо заезженного
echo -e "1\n\n    test\n    \n2"|grep -vE '^$'
# есть и
echo -e "1\n\n    test\n    \n2"|grep .

# убрать пустые строки и строки из табов и пробелов тоже:
echo -e "1\n\n    test\n    \n2"|grep '\S'
echo -e "1\n\n    test\n    \n2"|sed '/^\s*$/d'

# убрать пустые строки, строки из табов и пробелов и bash комментарии (напр. в конфигах)
sed '/^\s*$/d;/^\s*#/d;'