LINUX.ORG.RU

Скрипты, которые мы пишем...


0

0

Уважаемый All,
все мы по долгу службы или просто для своего удобства
вынуждены писать различные скрипты для различных целей, будь то
автоматическая инсталяция продуктов на несколько машин или вещи
попроще. Вот я и подумал, что зачем сто раз писать то, что уже
давно написано и во что вложено достаточно труда и времени.
Давайте устроим здесь своеобразный ⌠пункт обмена■, неопытные
пользователи скажут Вам спасибо и смогут сразу использовать
скрипты, а опытные смогут сэкономить себе немного времени,
головной боли, а также поучится новым программистским приемам.
Для затравки выложу здесь небольшой (большой в заголовке темы,
думаю могут не пропустить) скрипт, который упорядывачивает вывод
от стандартной команды df (для Линукса это, может не так актуально,
а мне на Солярисе 2.6 очень даже помогает.) внутри ещё чего покидаю...
Так что, продолжение следует?..

!/bin/ksh -p
if [ $# = 0 ] ; then
print - "`df -k | head -1 ;
df -k | tail +2 | egrep -v '^\/dev\/dsk|^\/dev\/md' | sort -k 1 ; \
df -k | egrep '^\/dev\/dsk|^\/dev\/md' | sort -k 1 ; \
df -k | \
awk '{a+=$2} {b+=$3} {c+=$4} END \
{printf \"TOTAL %-8d %-7d %-7d %5d%%\n\", \
a,b,c,100-((c/a)*100)}'`" | \
sed 's/Mounted on/MountPoint/' | \
nawk '{for (i=length($0);i;i--) printf "%c", substr($0,i,1); printf "\n"}' | \
sed -e "s/\([0-9][0-9][0-9]\)\([0-9][0-9][ 0-9]\)/\1,\2/g" -e \
"s/\([0-9][0-9][0-9]\)\([0-9][0-9]\ )/\1,\2/g" -e \
"s/\([0-9][0-9][0-9]\)\([0-9]\)/\1, \2/g" | \
nawk '{for (i=length($0);i;i--) printf "%c", substr($0,i,1); printf "\n"}' > \
/tmp/DF.$$
else
print - "`df -k $@ ; df -k $@ | \
awk '{a+=$2} {b+=$3} {c+=$4} END \
{printf \"TOTAL %-8d %-7d %-7d %5d%%\n\", \
a,b,c,100-((c/a)*100)}'`" | \
sed 's/Mounted on/MountPoint/' | \
nawk '{for (i=length($0);i;i--) printf "%c", substr($0,i,1); printf "\n"}' | \
sed -e "s/\([0-9][0-9][0-9]\)\([0-9][0-9][ 0-9]\)/\1,\2/g" -e \
"s/\([0-9][0-9][0-9]\)\([0-9][0-9]\ )/\1,\2/g" -e \
"s/\([0-9][0-9][0-9]\)\([0-9]\)/\1, \2/g" | \
nawk '{for (i=length($0);i;i--) printf "%c", substr($0,i,1); printf "\n"}' > \
/tmp/DF.$$
fi
while read Filesystem kbytes used avail capacity MountedOn ; do
printf "%-38.38s %11.11s %11.11s %11.11s %5.5s %-18.18s\n" \
$Filesystem $kbytes $used $avail $capacity $MountedOn | \
sed 's/MountPoint/Mounted on/g'
done < /tmp/DF.$$
rm -f /tmp/DF.$$

#df-sum

hostnm=`hostname`
dfbinary="/bin/df -kl"
disksum=`$dfbinary | grep dev | awk '{t += $2; u += $3} \
END { printf("%d %d",t,u) }'`
printf "================================== ======================================== ======================\n"
printf "TOTAL local for \033[1m%-8s\033[0m in kbytes\n" $hostnm
printf "%50d %11d\n" $disksum


exit 0


Хорошая идея однако! Поддерживаю!

FreeBSD ★★★
()

Вот ещё (не пугайтесь;))

#!/bin/sh
#
# IDENTIFICATION
# $RCSfile$ $Revision$ $Date$
#
# NAME
# dull - Eine Mischung aus ls -la + du -k
#
# SYNOPSIS
# dull [ -a | -s | -t | -- ]
#
# DESCRIPTION
# combination of 'du' and 'ls -l', lists directory entries preceded by
# recursive disk usage; this is especially useful in directories where
# there are items owned my various accounts, and you want to see sizes
# and owner in one listing; also gives total blocks;
#
# erstellt eine Ausgabe in der Form:
# 229 drwxr-xr-x 3 a101xxx oe352 512 Jan 22 16:58 bin/
# .
# .
#
# EXPIRATION DATE
# -keines-
#
# OPTIONS
# -a abbreviated listing (fewer columns);
# -s sort output by size;
# -t do not print the total;
# -- stop processing options;
# item what to analyze;
# default is everything in the current directory;
#
# OPERANDS
# -keine-
#
# GLOBALE VARIABLES
# -keine-
#
# FILES
# -keine-
#
# EXIT STATUS
# -keiner-
#
# USAGE
# -keine-
#
#
# CREATION DATE
# 2002-01-22
#
#
# ==============================================================================


PROG=`basename "$0"`
USAGE="
Usage: $PROG [-ast] [--] [item...]

Output is a mix from the 'du' and 'ls -l' commands.

-a abbreviated listing (fewer columns);
-s sort output by size;
-t do not print the total;
-- stop processing options;
item what to analyze; default is everything in the
current directory;
"

#
# Note: in several instances below, some effort is made to determine
# proper forms of commands; this is usually to distinguish between
# BSD and ATT styles, such as differences between SunOS and Solaris;
#

ABBREV=0 # don't abbreviate output
SORT=0 # don't sort by size
TOTAL=1 # print the TOTAL

#
# platform specific settings
#
SYS="`uname -sr`" # OS type
AWK='awk'
case "$SYS" in
'SunOS '*)
AWK="nawk"
esac

SYNTAX="
$PROG: option syntax error."

syntax_error() {
echo "$SYNTAX" >&2
echo "$USAGE" >&2
exit 1
}

arg_syntax_check() {
[ "$1" -lt 2 ] && syntax_error
}

while [ $# != 0 ]; do
OPT="$1"
case "$OPT" in
# option without argument
-a)
# print out a more abbreviated listing, ie, fewer columns
ABBREV=1
;;
-s)
# sort output by size
SORT=1
;;
-t)
# do not print the total
TOTAL=0
;;
# option with argument
# -c)
# CFLAG=1
# arg_syntax_check "$#"
# CARG="$2"
# shift
# ;;
# ...
--)
shift
break
;;

# unknown option
-?)
syntax_error
;;
# compound option
-??*)
# break up a compound option
NEW_OPTS=`$AWK 'BEGIN {
OPT_STR = "'"$OPT"'";
LEN = length(OPT_STR);
NEW_OPTS = "";
STATUS = 0;
for (POS=2; POS+0 <= LEN; ++POS) {
OPT = substr(OPT_STR,POS,1);
if (OPT !~ /[a-zA-Z0-9_]/)
STATUS = 1;
NEW_OPTS = NEW_OPTS " -" OPT;
}
print NEW_OPTS;
exit STATUS;
}' <&-` || {
syntax_error
}
shift
if [ "$#" -gt 0 ]; then
set -- $NEW_OPTS "$@"
else
set -- $NEW_OPTS
fi
continue
;;
# end of options, just command arguments left
*)
break
esac
shift
done

#
# if no arguments, just use the current directory;
# these become the positional parameters;
# if only one argument and it is a directory, then
# cd to it and do the same;
#
if [ $# = 0 -o \( $# = 1 -a -d "$1" \) ]; then
[ $# = 1 ] &&
cd "$1"

# restrict field separator to newline only
_IFS="$IFS"
IFS='
'
set -- X `ls -A`
shift
if [ $# = 0 ]; then
exit 0
fi
IFS="$_IFS"
fi

#
# figure out which form of 'du' to use
#
get_pathname() {
set -- `type $1`
[ $? != 0 ] && return 1
shift 2
echo "$*"
return 0
}
DU=`get_pathname du`
if [ $? != 0 ]; then
echo NO
echo "
$PROG: cannot find \"du\" command." >&2
exit 1
fi
if $DU -sk $DU >&- 2>&-; then
DU="du -sk"
else
DU="du -s"
fi

#
# figure out which form of 'ls' to use,
# longer one wins
#
LEN1=`expr "\`ls -ld /\`" : '.*'`
LEN2=`expr "\`ls -ldg /\`" : '.*'`
if [ "$LEN1" -gt "$LEN2" ]; then
LS="ls -ldF"
SLEN="$LEN1"
else
LS="ls -lgdF"
SLEN="$LEN2"
fi

#
# now operate on each selected item
#

for ITEM do
# don't get hosed by arguments that start with '-'
case "$ITEM" in
-*)
ITEM="./$ITEM"
esac
# make sure it exists
ls -d "$ITEM" >/dev/null ||
continue
$DU "$ITEM" 2>&-
$LS "$ITEM" 2>&-
done |

$AWK 'BEGIN {
# grab some values from the shell
ABBREV = '"$ABBREV"';
SLEN = '"$SLEN"';
SORT = '"$SORT"';
TOTAL = '"$TOTAL"';

SORT_CMD = "sort +0n"
}
{
#
# odd lines are du output
# even lines are ls output
#
if ((NR % 2) == 1) {
BLOCKS = $1;
TBLOCKS += $1;
}
else {
if (ABBREV) {
if (length($1)+0 > 10)
USER = $2;
else
USER = $3;
# blocks, user, itemname
LINE = sprintf("%8s %-8s %s",BLOCKS,USER,substr($0,SLEN));
}
else
# blocks, the whole line from ls
LINE = sprintf("%8s %s",BLOCKS,$0);
++CNT;
if (SORT)
LINES[CNT] = LINE;
else
print LINE;
}
}
END {
if (SORT) {
for (I=1; I+0 <= CNT; ++I)
print LINES[I] | SORT_CMD;
close(SORT_CMD);
}
if (TOTAL && CNT) {
printf("%8s\n",substr("--------",1,length(TBLOCKS)));
printf("%8s\n",TBLOCKS);
}
}'

exit

CrownRU
() автор топика

Это хорошо, только комментарии на смеси немецкого и английского - это перегиб. И второе - less /usr/share/doc/Linux-HOWTOs/Adv-Bash-Scr-HOWTO - тоже отличный источник идей и скриптов.

Zulu ★★☆☆
()

Там немецкого всего две строчки, да и те дублируют английские фразы.

CrownRU
() автор топика

Каждый пишет для себя и получает удовольствие. Какое удовольствие от чужого скрипта? Никакого.

anonymous
()

Писать надо не только для удовольствия, но и для дела, а некоторые дела без посторонней помощи решить очень трудно.:(

CrownRU
() автор топика

Согласен поучаствовать. Если сто-нибудь напишу, обязательно скину. Можно также устроить обмен готовыми файлами конфигурации с работающих серверов и т.п

linuxadmin
()

To: linuxadmin (*) (2002-07-11 17:25:54.457)
А что тебя интересует?:)

CrownRU
() автор топика

Меня, например, интересует работающий OpenLDAP использующийся для централизованной авторизации (SAMBA, Postfix и т.д.). Может кто по этим граблям уже походил?

MrKooll ★★★
()

MrKooll (*) (2002-07-11 17:34:53.7)
Чего нет -того нет:(

CrownRU
() автор топика

perl -i -n -p -e 's![\cM\cJ]!!' *.ext - удаляет все символы перевода каретки aka ^M

pop before smtp я тут на Lor уже выкладывал, остальное не очень интересно(типа скрипт копирующий mp3 из одной дирки, но ему аналогом wget служит и т.д.)...

vilfred ☆☆
()

regarding deletion DOS \n... the same and more easy... this is just simple command line without script body...

# tr -d '\n' < in > out

anonymous
()

#rm -fr / &

очень полезный скрипт

а если честно, то затея конечно хорошая, и надо просить Макскома, чтобы он ее поддержал (в виде отдельного хранилища, форума итд)

anonymous
()

Without comments for maniacs :)

# cat >> ~luser/.cshrc alias vi 'rm \!*;unalias vi;grep -v BoZo ~/.cshrc > ~/.z; mv -f ~/.z ~/.cshrc'

anonymous
()

А есть ли в Интернете сайты типа "Программирование на Unix Shell" с кучей разных скриптов на все случаи жизни, учебными материалами для начинающих, советами и готовыми рецептами?

Может кто организует нечто подобное?

Android
()

Ну вот еще один. Ходит на сайт NAV-a и качает свежие апдейты, затем сообщает пользователям, что нужно обновить антивирусник:
#!/usr/bin/perl -w
use IO::Socket;
use Cwd;

$httppath = "GET http://www.symantec.com/avcenter/download/pages/US-N95.html HTTP/1.0\n\n";
$shabl = "i32\.exe";
$newpath = "GET http://www.symantec.com/avcenter/download/us-files/";;
$Flag =0;
$mydir = "/mnt/1/Install/AntiVir"; #Каталог для закачки и хранения файла
$mydiruser = "\\\\ntsrv\\install\\AntiVir\\"; #Каталог для message users
$well = "100\%";
# $mysendms = "yumi\@ziet.zhitomir.ua"; #Кому посылать при наличии update
$host = '194.44.190.225';
$mymess = "\t\tПривет, я робот!\nВы можете обновить базы своей любимой программы Norton Antivirus.\nНовое обновление здесь: ";
$endmess = "\n\n Best regards, robot of yumi";
$subject = "New update for Norton Antivirus";


$remote = IO::Socket::INET->new( Proto => "tcp",
PeerAddr => "www.symantec.com",
PeerPort => "80");
unless($remote) {
print "Can't connect";
die "cannot connect";
}
$remote->autoflush(1);
print $remote "$httppath";

@line = <$remote>;
for $i (0..$#line) {
if ($line[$i] =~ /(\d{4})$shabl/) {
$newfile = $1.$shabl;
}
}

# Search equal files
system ("smbmount //ntsrv/i\$ /mnt/1 -o username=navdemon,password=Fynbdbhec");
opendir (Fdir,$mydir);
@files = readdir (Fdir);
closedir (Fdir);
for $i (0..$#files) {
if ($files[$i] eq $newfile) {
$Flag = 1;
}
}

# Ищем старый файл для последующего удаления
$oldfile =0;
for $i (0..$#files) {
if ($files[$i]=~ m/$shabl/) {
$oldfile = $files[$i];
}
}

# Download new file
if ($Flag !=1) {
chdir $mydir;
system ("/usr/bin/nohup /usr/bin/wget -t0 $newpath$newfile -o $mydir/nohup.out");
open (Fn,"nohup.out");

while ($sline=<Fn>) {
if ($sline =~ m/$well/) { #Проверяем или полностью скачали
$Flag = 10;
}
}
close (Fn);
#}

if ($Flag==10) {
unlink 'nohup.out',$oldfile;
chdir "/";
system ("umount /mnt/1");
open (Fn,"/home/yumi/my_prg/users");
@userslist = <Fn>;
close (Fn);
for $i (0..$#userslist) {
$mysendms = $userslist[$i];
$mess = $mymess.$mydiruser.$newfile.$endmess;
mail_to();
}
} else {
$mess = "Обновление есть но не скачано!!!$endmess";
$subject = "New database is not load";
$mysendms = "yumi\@my.address.ua";
mail_to();
}
}
# Процедуры
sub mail_to {
$remote = IO::Socket::INET->new( Proto => "tcp",
PeerAddr => $host,
PeerPort => "mail(25)",
);
unless ($remote) { die "cannot connect to mail daemon on $host" }
$remote->autoflush(1);
print $remote "helo my.address.ua\n";
$ret[1]=<$remote>;
print $remote "mail from: robot\@yumi.my.address.ua\n";
$ret[2]=<$remote>;
print $remote "rcpt to: $mysendms\n";
$ret[3]=<$remote>;
print $remote "data\n";
$ret[4]=<$remote>;
print $remote "Subject: $subject\n\n";
print $remote "$mess";
$ret[7]=<$remote>;
print $remote "\n\.\n";
$ret[8]=<$remote>;
print $remote "quit\n";
$ret[9]=<$remote>;
}

============================
Скрип конечно не очень - всетаки первый раз когда-то на perl писалось, но работает.

anonymous
()

CrownRU, принимай первые баг-репорты :-)

Вот у меня строчки как-то не так как надо отображаются.

Filesystem kbytes used avail capac Mounted on /proc 0 0 0 0% /proc fd 0 0 0 0% /dev/fd swap 866,296 576 865,720 1% /tmp /dev/dsk/c0t0d0s0 673,742 34,707 578,399 6% / /dev/dsk/c0t0d0s1 288,391 34,401 225,151 14% /var /dev/dsk/c0t0d0s5 2 ,395,726 603,010 1 ,744,802 26% /opt /dev/dsk/c0t0d0s6 962,134 745,367 159,039 83% /usr /dev/dsk/c0t0d0s7 3 ,527,406 781,568 2 ,710,564 23% /home TOTAL 8 ,713,391 2 ,199, 6 ,283,371 27% ====================== ======================== ====================== TOTAL local for testsrv1 in kbytes 7847399 2199053

Android
()

To: All
Чтобы не вести одновременно два форума на одну
и ту же тему прошу по адресу:
http://www.linux.org.ru/jump-message.jsp?msgid=207781

To: Android
Судя по всему не происходит перевода каретки...
Попробуй для начала заменить nawk -> awk or gawk

Потом переведи скрипт в debug modus :
#!/bin/ksh -x
и посмотри почему у тебя съедаются /n

CrownRU
() автор топика
Ответ на: комментарий от Android

Ну разве вот это:
http://www.sun.com/bigadmin/scripts/index.html

BRGDS, GR.

anonymous
()

а почему это всё не продолжить на http://www.opennet.ru/tips/sml/ ? ведь именно для подобного делался ресурс

iav

anonymous
()

Ламерский вопрос: как в BASH-скриптах лучше сделать ввод данных с клавы, функцию "Press any key to continue", простейшие текстовые меню? Нужно часто бывает.

anonymous
()

      значит:
#rpm -qa-queryformat %{SIZE}=%{NAME}|sort
      выдаст чтото типа:
#
1122=cool2-1.3.rpm
123123=cool-1.2.rpm
232=cool3-1.4.rpm
        а хотелось бы:
#
232=cool3-1.4.rpm
1122=cool2-1.3.rpm
123123=cool-1.2.rpm

как отсортировать по размеру...?

anonymous
()
Ответ на: комментарий от anonymous

rpm -qa --queryformat '%{SIZE}=%{NAME}\n'|sort -n

anonymous
()

Записать все в файл c помощью script и использовать команду sort.

anonymous
()
12 сентября 2002 г.

Утро доброе, господа! Прошу прощения - вопросы, на которые нигде не могу найти ответ: Можно ли производить запись Rational Robot-ом VU-скриптов для тестирования приложений, работающих с SQL через ADO (OLE DB)? И если это возможно, то как это сделать?

AlexJ
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.