Go to content Go to menu Go to search

Однострочные и простые 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


при публикации материалов с данного сайта обратная ссылка на сайт обязательна.
valynkin.ru © no rights reserved