выбор строки
Добавлено: 2008-02-20 22:53:42
народ подскажите как можно из /var/log/secure выдрать по маске определенные строки ?
Раз не осталось живых, значит мертвые — Встать!
https://forum.lissyara.su/
Код: Выделить всё
for I in `cat /var/log/secure`
do
echo $I
done
чет непонялparanoidchaos писал(а):Код: Выделить всё
IFS=\n
hammer68 писал(а):чет непонялparanoidchaos писал(а):Код: Выделить всё
IFS=\n
Код: Выделить всё
man sh
для этого специальная прога естьhammer68 писал(а):вот хотел сделать так но не строки выводит а слова а мне всю стоку надо
в твоём случаеparanoidchaos писал(а):grep or egrep
Код: Выделить всё
grep "шаблон" /var/log/secure
Код: Выделить всё
man grep
да я понимаю но в том то и дело я когда цикл делаю то вывод у мну не такой какzg писал(а):для этого специальная прога естьhammer68 писал(а):вот хотел сделать так но не строки выводит а слова а мне всю стоку надов твоём случаеparanoidchaos писал(а):grep or egrepпро шаблоны и синтаксис вызоваКод: Выделить всё
grep "шаблон" /var/log/secure
Код: Выделить всё
man grep
lissyara писал(а):hammer68 писал(а):чет непонялparanoidchaos писал(а):Код: Выделить всё
IFS=\n
Код: Выделить всё
man sh
)))))))))))))))))))
Код: Выделить всё
Feb 22 10:00:49 cluster sshd[31279]: Accepted password for olimp_belikov from 82.179.145.50 port 1881 ssh2
Feb 22 13:01:41 cluster sshd[31337]: reverse mapping checking getaddrinfo for ip-82-179-145-50.apte.tstu.ru failed - POSSIBLE BREAKIN ATTEMPT!
Feb 22 13:01:47 cluster sshd[31337]: Failed password for olimp_belikov from 82.179.145.50 port 1882 ssh2
Feb 22 10:01:47 cluster sshd[31338]: Failed password for olimp_belikov from 82.179.145.50 port 1882 ssh2
Feb 22 10:01:53 cluster sshd[31338]: Failed password for olimp_belikov from 82.179.145.50 port 1882 ssh2
Feb 22 13:01:53 cluster sshd[31337]: Failed password for olimp_belikov from 82.179.145.50 port 1882 ssh2
Feb 22 10:01:57 cluster sshd[31338]: Accepted password for olimp_belikov from 82.179.145.50 port 1882 ssh2
Feb 22 13:01:57 cluster sshd[31337]: Accepted password for olimp_belikov from 82.179.145.50 port 1882 ssh2
Feb 22 10:33:14 cluster sshd[31573]: Accepted password for pchela9091 from 82.179.158.249 port 40524 ssh2
Feb 22 13:33:14 cluster sshd[31572]: Accepted password for pchela9091 from 82.179.158.249 port 40524 ssh2
Код: Выделить всё
Feb 22 13:01:41 olimp_belikov 82.179.145.50
Код: Выделить всё
Feb 22 10:01:57 cluster sshd[31338]: Accepted password for olimp_belikov from 82.179.145.50 port 1882 ssh2
Код: Выделить всё
Feb 22 13:01:41 olimp_belikov 82.179.145.50
Код: Выделить всё
grep 'Accepted password' /var/log/secure > file_name
while read parametr
do
par1=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $1}'`
par2=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $2}'`
par3=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $3}'`
par4=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $4}'`
par5=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $5}'`
par6=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $6}'`
par7=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $7}'`
par8=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $8}'`
par9=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $9}'`
par10=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $10}'`
par11=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $11}'`
par12=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $12}'`
par13=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $13}'`
par14=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $14}'`
str="$par1 $par2 $par3 $par9 $par11\n"
echo $str > output_file
done < file_name
спасибочки в общем окнчательно скрипт выглядит такparanoidchaos писал(а):как я понял из этой строки
нужно достать этуКод: Выделить всё
Feb 22 10:01:57 cluster sshd[31338]: Accepted password for olimp_belikov from 82.179.145.50 port 1882 ssh2
так вот в этом случае лучше использовать авк (awk)Код: Выделить всё
Feb 22 13:01:41 olimp_belikov 82.179.145.50
вот кусок кода в цикле разбивается строка по пробелам и все параметры на руках и пихать можно как угодно и куда угодноКод: Выделить всё
grep 'Accepted password' /var/log/secure > file_name while read parametr do par1=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $1}'` par2=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $2}'` par3=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $3}'` par4=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $4}'` par5=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $5}'` par6=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $6}'` par7=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $7}'` par8=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $8}'` par9=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $9}'` par10=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $10}'` par11=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $11}'` par12=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $12}'` par13=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $13}'` par14=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $14}'` str="$par1 $par2 $par3 $par9 $par11\n" echo $str > output_file done < file_name
Код: Выделить всё
#!/bin/sh
day="`date +%d-%m-%y`"
chislo="`date +%b" "%e`"
grep "$chislo" /var/log/secure >tmp$day.txt
grep 'Accepted password' tmp$day.txt > temp$day
while read parametr
do
par1=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $1}'`
par2=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $2}'`
par3=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $3}'`
par4=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $4}'`
par5=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $5}'`
par6=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $6}'`
par7=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $7}'`
par8=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $8}'`
par9=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $9}'`
par10=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $10}'`
par11=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $11}'`
par12=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $12}'`
par13=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $13}'`
par14=`echo "$parametr" | awk 'BEGIN{FS=" "}{print $14}'`
str="$par1 $par2 $par3 $par9 $par11"
echo $str >> /var/log/access/access$day.txt
done < temp$day
rm -rf tmp$day.txt
rm -rf temp$day
Код: Выделить всё
cat /var/log/secure | grep 'Accepted password' | awk '{print $1,$2,$3,$9,$11}' > file_name
а одним awk'ом обойтись не судьба?dikens3 писал(а):Код: Выделить всё
cat /var/log/secure | grep 'Accepted password' | awk '{print $1,$2,$3,$9,$11}' > file_name
Код: Выделить всё
awk '/Accepted password/ { print $1, $2, $3, $9, $11 }' /var/log/secure >file_name
Код: Выделить всё
cut -sd\ -f1,2,3,9,11 /var/log/secure
Удобнее... На скрипт выше посмотри. Я лишь показал альтернативу, которая гораздо удобнее и при этом никого не оскорбляя. Чего ты добиваешься? Хочешь продемонстрировать свои знания программирования? И что это тебе даст, если результат всё равно один и тот же? Для простейших операций вполне подойдёт ЛЮБОЕ решение сделанное своими руками.Гость писал(а):Или по воробьям из пушки удобнее?
Если делать ударение на "свои руки", то твой пример вообще неуместен, потому что копипаста под это понятие не попадает. Короче, держи бублик за useless use of cat, т.е. за совет (и популяризацию) о том как заработать дурную привычку.dikens3 писал(а):Для простейших операций вполне подойдёт ЛЮБОЕ решение сделанное своими руками.
Попробуй так:hammer68 писал(а):Код: Выделить всё
grep "$chislo" /var/log/secure >tmp$day.txt grep 'Accepted password' tmp$day.txt > temp$day [...]
Код: Выделить всё
#!/bin/sh
# формат подстановки вывода команды `foo` устарел в угоду $(foo) [см. ниже цитату с opengroup.org]
date_stamp="$(date +%F)" # если ставить год в конце, отгадай как сортировка по имени файла себя поведет?
# %F is equivalent to ``%Y-%m-%d''.
date_string="$(date +%b\ %e)"
# это можно сделать и только sed'ом, но тогда придется использовать
# костлявые [[:space:]]\{1,\} ,)
# вообщем, sed тут вырезает первые два совпадения построчно, т.е. удаляет не соответствующие regexp'ы
# а cut вырезает ненужные столбцы, точнее оставляет только выбранные
#
# Кстати, нужно тестировать, но обычно sed работает *быстрее* чем awk
sed "/$date_string/!d; /Accepted password/!d" /var/log/secure \
| cut -sd\ -f1,2,3,9,11 >/var/log/access/access$date_stamp.txt
Т.е., используя `foo` в новых программах, мы сами себе откапываем могилу.http://www.opengroup.org/onlinepubs/009695399/xrat/xcu_chap02.html писал(а):Код: Выделить всё
Additionally, the backquoted syntax has historical restrictions on the contents of the embedded command. While the newer "$()" form can process any kind of valid embedded script, the backquoted form cannot handle some valid scripts that include backquotes. For example, these otherwise valid embedded scripts do not work in the left column, but do work on the right: echo ` echo $( cat <<\eof cat <<\eof a here-doc with ` a here-doc with ) eof eof ` ) echo ` echo $( echo abc # a comment with ` echo abc # a comment with ) ` ) echo ` echo $( echo '`' echo ')' ` ) Because of these inconsistent behaviors, the backquoted variety of command substitution is not recommended for new applications that nest command substitutions or attempt to embed complex scripts.
Поскольку переменные используются только по одному разу, то можно их вообще выкинуть и поставить эти подстановки прямиком в one-liner:Гость писал(а):Код: Выделить всё
date_stamp="$(date +%F)" date_string="$(date +%b\ %e)"
Код: Выделить всё
sed "/$(date +%b\ %e)/!d; /Accepted password/!d" /var/log/secure \
| cut -sd\ -f1,2,3,9,11 >/var/log/access/access$(date +%F).txt
Код: Выделить всё
> swapoff /dev/zvol/tank/page
> ^ff^n
Код: Выделить всё
> diff -u /usr/include/sys/lock.h /sys/sys/lock.h
> cp !$ !:2
Код: Выделить всё
> !?lissyara
Так и не понял о чём здесь.Если делать ударение на "свои руки", то твой пример вообще неуместен, потому что копипаста под это понятие не попадает.