The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"помогите написать небольшую программу под shell"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"помогите написать небольшую программу под shell"  +/
Сообщение от garilla (ok) on 23-Май-09, 16:52 
Совсем недавно начал изучать это дело, возникли некоторые затруднения. Мне нужно написать программу, которая печатает конец файла. По умолчанию – 10 последних строк (получается полный аналог команды tail). Конкретно затруднение вызвало передача параметра в строку: sed -e :a -e '$q;N;11,$D;ba' text.txt (печатает последние 10 строк из text.txt)
т.е. мне нужно вместо числа подставить параметр который я передаю, как это сделать?
И еще такая проблема: нужно как-то проверить передается ли параметр вообще. Т.е. если параметр передается, то я вывожу столько строк сколько передал, а если нет то 10. Как можно определить передается ли параметр в программу?
Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "помогите написать небольшую программу под shell"  –1 +/
Сообщение от angra (ok) on 23-Май-09, 22:25 
Во-первых, студентам тут не подают
Во-вторых, если вам задают сделать аналог tail на bash, то обычно это означает на _чистом_ bash, без всяких внешних команд типа sed. Задача в общем-то элементарная и решается на чистом bash за пять минут после чтения описания команды read
В-третьих, почитайте man bash или abs(https://www.opennet.ru/docs/RUS/bash_scripting_guide/) на предмет использования кавычек.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "помогите написать небольшую программу под shell"  +/
Сообщение от garilla (ok) on 24-Май-09, 14:11 
>Во-первых, студентам тут не подают

Я не прошу у вас никаких подачек.
А за ссылку на вменяемое руководство большое спасибо.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "помогите написать небольшую программу под shell"  +1 +/
Сообщение от garilla (ok) on 24-Май-09, 17:33 
Посмотрите кто-нибудь и оцените работоспособность, пожалуйста:

n='wc -l text.txt'      #подсчет кол-ва строк в файле text.txt
temp=0                  
lines=0
if [-n "$1"]            #проверка наличия параметра
then lines=$1
else lines=10
fi
let "$n-=$lines"        #в n записывается номер строки с которой нужно выводить текст
while read line
do
let "$temp+=1"         #номер текущей строки
if [$n -le $temp]      #если номер тукщей строки больше n
  then echo "$line"     #то эта строка выводиться на экран
done

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "помогите написать небольшую программу под shell"  +/
Сообщение от angra (ok) on 24-Май-09, 21:10 
>Посмотрите кто-нибудь и оцените работоспособность, пожалуйста:

работоспособность вообще-то оценивается пробным запуском и вы это можете сделать сами.
>n='wc -l text.txt'      #подсчет кол-ва строк в

А почему сразу не sed или вообще tail? Какой смысл всего остального, после использования внешней команды? Если есть желание сделать в один проход и на чистом шелле, то стоит прочитать про массивы и циклы for

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "помогите написать небольшую программу под shell"  +/
Сообщение от tux2002 email on 29-Май-09, 13:23 
#!/bin/sh

#################аргументы##########################
n=5 # Количество строк
myfile="/var/log/messages" #При режиме file
#tailmode="stdin"
tailmode="file"
####################################################

counter=0
if [ $tailmode = "file" ]
then
    exec 0>&- # Закрываем stdin
    exec 0<$myfile # Открываем stdin из файла
fi

while read line <&0
do
    for (( i=1; i < n; i++))
    do
        lines[$i]=${lines[$i+1]}
    done
    lines[n]=$line
    let "counter++"
done

nr=$n

if [ $counter -lt $n ]
then
    nr=$counter # Если строк меньше n
fi


for (( i=n-nr+1; i <= n ; i++))
do
    echo ${lines[$i]}
done

# В этом режиме в бесконечный цикл ожидания следующей строки
if [ $tailmode = "file" ]
then
    while [ true ]
    do
        while read line <&0
        do
            echo $line
        done
    done
fi


В качестве черновика (мож с ошибками Сами тестируйте)


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2023 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру