Однострочные и простые shell скрипты awk, sed
AWK
Посчитать среднюю задержку в доставке писем почтовым сервером
cat /var/log/maillog | awk '/delay=(.*),/ {match($0, /delay=([0-9]+)/, arr); if(arr[1] != "" && arr[1] > 60) {summ=summ+(arr[1]/60); count++} } END {print "SUMM: " summ "\nCOUNT: " count "\nAVERAGE: " summ/count}'
Shell
Переместить все файлы в которых содержатся нужные слова в другой каталог:
grep "Received: from mx11a.baynet.com" ./* | awk -F: '{print $1}' | while read -r line; do mv $line ./baynet/; done
Читать файл и выполнять действия для каждой строки
есть файл list_of_files:
2049056182 AidaCamara-735x1024.jpg 2049050759 AlanHollaar.jpg 2049052649 AlanOnoye.jpg 2049050281 alex-gandel.jpg
Скрипт читает этот файл, выделяет ID в первом столбце, выделяет имя файла во втором столбце, и раскладывает файлы по папкам в соответствии с ID:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #!/bin/bash INPUT_FILE="./list_of_files" INPUT_DIR='Troop' DST_DIR='/mnt/NAS3/Images/usr' while read LINE do realtor_id=$(echo $LINE | awk '{ print $1 }') file_name=$(echo $LINE | sed -nr 's/^[0-9]+\s+(\S+\s*\S+.jpe*g).*/\1/p') echo"" echo "realtor_id:" $realtor_id echo "file_name: " $file_name if [ -e $DST_DIR/$realtor_id ]; then echo "cp $INPUT_DIR/$file_name $DST_DIR/$realtor_id/" cp -f "$INPUT_DIR/$file_name" "$DST_DIR/$realtor_id/" else echo "ERROR: Cant find $DST_DIR/$realtor_id/"; fi done < $INPUT_FILE |
Переименовать все .jpg файлы в текущем каталоге и привести к нижнему регистру
1 2 3 4 5 6 7 | #!/bin/bash for file in *.JPG do F=`echo $file | tr -s ’[:upper:]’ ’[:lower:]’` #echo $F mv $file $F done |
SED
добавить 4пробела в начале каждой строки
's/^/ /'
Читать из файла строки
while IFS= read -r -u3 line; do echo $line done 3< ./file.txt
Посчитать распределение файлов по размеру в текущей папке рекурсивно
find . -type f -print0 | xargs -0 ls -l | awk '{ n=int(log($5)/log(2)); if (n<10) { n=10; } size[n]++ } END { for (i in size) printf("%d %d\n", 2^i, size[i]) }' | sort -n | awk 'function human(x) { x[1]/=1024; if (x[1]>=1024) { x[2]++; human(x) } } { a[1]=$1; a[2]=0; human(a); printf("%3d%s: %6d\n", a[1],substr("kMGTEPYZ",a[2]+1,1),$2) }'
результат:
1k: 2137 2k: 2120 4k: 4745 8k: 11348 16k: 22738 32k: 39774 64k: 47011 128k: 56348 256k: 89584 512k: 102319