LINUX.ORG.RU

Вывести в терминале последние 20строк файла одним цветом ,остальное другим?

 


2

1

имеем файл /tmp/test
нужно вывести первые строки (до 20 с конца)в одном цвете (RED), последние 20 в другом (YELLOW)
Спасибо.



Последнее исправление: sotvm (всего исправлений: 1)

Я думаю, что тебе могут помочь head, tail, wc -l. И по идее можно наговнокодить на awk, но его я не знаю почти.

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

tail --lines=20 /tmp/test выведет 20 стр. с конца файла
не соображу ,как вывести с начала файла до 20стр. с конца
как раскрасить ,тоже не совсем понятно,
так трудно привести пример?

sotvm
() автор топика
$ cat n20.sh
#!/usr/bin/bash

echo -e '\e[0;31m'
head -n-20 "$1"
echo -e '\e[1;33m'
tail -n20 "$1"
echo -e '\e[0m'
$ chmod +x n20.sh
$ ./n20.sh /tmp/test
...
anonymous
()
Ответ на: комментарий от sotvm

так трудно привести пример?

Если не трудно, то почему сам не можешь сделать? Не хочет человек и не приводит, не надо ныть о том, что он что-то тебе не сделал.

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

и всего то ? Спасибо, а то я по незнанию наговнокодил ㋛
хоть и рабочий вариант,но «корявый» и не уневерсальный.

fortune | cowsay > /tmp/cowsay ;
grep -e '--------$' /tmp/cowsay -B50 -A0 | lolcat -F 0.0033 ;
tail -n 20 /tmp/cowsay | lolcat -a -s 500 -F 3 ;echo " " ; sleep 4s ; clear ;
потом подсказали вот так = уже лучше
fortune | cowsay  >  /tmp/cowsay ;
NUMS=$(cat /tmp/cowsay | wc -l)
let HEAD=$NUMS-20
head -n $HEAD /tmp/cowsay | lolcat -F 0.0033  ;
tail -n 20  /tmp/cowsay | lolcat -a -s 500 -F 3 ;echo " ";sleep 4s ;clear ;

подскажите пожалуйста ещё,а как раскрасить в определённый цвет ?(нужен пример)

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

Спасибо.
не сразу увидел ваш ответ,не сразу разобрался с командами ㋛

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

Сракой читал

cat bar | perl -MTerm::ANSIColor -e'@F=<>;print color(@F>20?red:yellow),shift@F,${POPCOLOR}while@F'

anonymous
()

Окончательный вариант

cat  /tmp/test | perl -MTerm::ANSIColor -e'@F=<>;print color(@F-++$i>20?red:yellow),$_ for@F'

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

окончательный ,уверен? сракой читаешь?

sotvm
() автор топика
Ответ на: комментарий от sotvm
fortune | cowsay  >  /tmp/cowsay ; 

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

TMP=`mktemp`
fortune | cowsay  >  $TMP
Точка с запятой там тоже не нужна.

Взгруснулось. Вот вам на bash:

#!/bin/bash

show_n() {
        local i v
        echo -n "$1"
        for ((i=$2;i<$3;i++)); do
                v=$4[$i]
                echo "${!v}"
        done
}

n=0
while IFS='
' read -r l; do
        lines[n++]=$l
done < <(fortune | cowsay)
first=$(($n-20))
show_n "$(tput setaf 1)" 0 $first lines
show_n "$(tput setaf 2)" $first $n lines
echo -n "$(tput setaf 0)"

Для сравнения, на ash:

#!/bin/ash

show_pseudo_array() {
        local i
        echo -n "$1"
        i=$2
        while [ $i -lt $3 ]; do
                i=$(($i+1))
                eval echo \"\$$4$i\"
        done
}

n=0
fortune | cowsay {
while IFS='
' read l; do
        n=$(($n+1))
        eval l$n=\$l
done
first=$(($n-20))
show_pseudo_array "$(tput setaf 1)" 0 $first l
show_pseudo_array "$(tput setaf 2)" $first $n l
echo -n "$(tput setaf 0)"
}

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.