LINUX.ORG.RU

[bash] Получить значение


0

1

Есть файл с текстом:
Name Surname 08.09.1986 Male
Выделяю из него дату рождения:
cat data_base | awk '{print $3}'
Получаю:
08.09.1986
У меня есть значение текущего года:
date_today=`date | awk '{print $6}'`
2011
Нужно выделить из 08.09.1986 год - будет 1986, вычесть его из текущего и получить возраст. Потом он занесётся в конец текста файла автоматически )))

# echo "Name Surname 08.09.1986 Male" > data_base

A=`cat data_base | awk '{print $3}' | gawk ' BEGIN { RS = "\0x00" ; FS = "." } { print $3 }'`

let BIRTH_YEAR="${A}"

CURRENT_YEAR=`date | awk '{print $6}'`

let VOZRAST="${CURRENT_YEAR}-${BIRTH_YEAR}"

echo VOZRAST = ${VOZRAST}
someloruser ()
Ответ на: комментарий от PymOxim

(.\{4\}\) маркирует с помощью скобок ту группу, которую хотим оставить. в данном случае это группа из 4 знаков после точки, остальное _*_ удаляем.

ciiccii ()
awk '{split($3,a,".");print "'"$(date +%Y)"'" - a[3]}' file

echo «Name Surname 08.09.1812 Male» | awk '{split($3,a,".");print «'»$(date +%Y)«'» - a[3]}'
199

zolden ★★★★★ ()
Ответ на: комментарий от zolden
#/usr/bin/gawk -f

BEGIN { year=strftime("%Y", systime())
}

{ split($3,a,".")
  print year-a[3]
}
sdio ★★★★★ ()

быдлокод

[ megabaks@desktop ] ~ $ AGE="$(( `date | awk '{print $6}'` - `echo "Name Surname 08.09.1986 Male" | awk '{print $3}' | cut -d\. -f3` ))"
[ megabaks@desktop ] ~ $ echo $AGE
25
[ megabaks@desktop ] ~ $
для тебя что-то типа
AGE="$(( `date | awk '{print $6}'` - `cat data_base | awk '{print $3}' | cut -d\. -f3` ))"

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

Хотел по типу мелкомягкого нслукапа сделать. Не получается немного.

# ip
ifconfig ppp0 | grep addr | awk '{print $2}' | sed 's/.*\(.\{14\}\)$/\1/'

# ip провайдера
nslookup `ifconfig ppp0 | grep addr | awk '{print $2}' | sed 's/.*\(.\{14\}\)$/\1/'` | grep Server | awk '{print $2}'

# dns провайдера
host `nslookup `ifconfig ppp0 | grep addr | awk '{print $2}' | sed 's/.*\(.\{14\}\)$/\1/'` | grep Server | awk '{print $2}'` | awk '{print $5}'`
Последний выводит ошибку. Наверное из-за лишних обратных апострофов. К тому же, в dns надо в конце убрать точку. А можно в одно действие и чтобы потом вывести выхлоп всех трех значений? ))))) Это вместо Кубика Рубика.

PymOxim ()

Сделал, пока, вот так.

#!/bin/sh
ip=`ifconfig ppp0 | grep addr | awk '{print $2}' | sed 's/.*\(.\{13\}\)$/\1/'`
server=`nslookup $ip | grep Server | awk '{print $2}'`
dns=`host $server | awk '{print $5}' | sed 's/ *.$//'`
echo "ip="$ip
echo "dns="$dns
echo "server="$server

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

Неплохо для начала. Операции вида
grep Server | awk '{print $2}
можно сократить до
awk '/Server/{print $2}

sed это сплошной вынос мозга, поэтому не хочу даже начинать думать про то, как это переписать на awk

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

sed это сплошной вынос мозга

+100500
Это максимально оптимизированный код

#!/bin/sh
ip=`ifconfig ppp0 | grep addr | awk '{print $2}' | sed 's/.*\(.\{13\}\)$/\1/'`
server=`nslookup $ip | awk '/Server/{print $2}'`
dns=`host $server | awk '{print $5}' | sed 's/ *.$//'`
echo "ip="$ip
echo "dns="$dns
echo "server="$server
или можно как-то еще компактнее записать?

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

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

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

На sh можно программировать. Хотя внешние утилиты часто бывают удобнее.

Язык автоматизации и компоновки вывода системных утилит.

glue language?

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

> На sh можно программировать. Хотя внешние утилиты часто бывают удобнее.
Как написать мой nslookup без использования системных утилит?

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

>Как написать мой nslookup без использования системных утилит?
Без ifconfig — сложно, хотя можно накостылить через чтение виртуальных ФС.
grep заменяется небольшим шаманством с read, например.
awk — опять же read. При необходимости с IFS.
sed заменяется шелловыми костылями для переменных (man zshexpn, к примеру).
nslookup костылится через /dev/tcp
host костылится через него же.

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

Это все через костыли. Своего набора инструментов у шелла, он пользуется системными утилитами. В том-то его и ограниченность.

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

>Это все через костыли.
Да ну? Это всё builtins. Из настоящих костылей тут разве что /dev/tcp.
Очень многое из этого используется для написания логики (конечно, её можно и на других языках писать).

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

Я останусь при своем мнении - это не язык программирования.

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

Шелл практически ничего не может. Хотя бы, по сравнению с Питоном. Открой для себя интерпретируемые языки сценариев.

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

> Python практически ничего не может. Хотя бы, по сравнению с asm. Открой для себя язык ассеблера(nasm например).
fxd

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

В данном скрипте, nslookup, вроде, используется для чтения файле /etc/resolv.conf. Но топик начинался с bash, а дошёл до sh.

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

PymOxim> Sh - это шелл. Командный интерпретатор. А баш это разновидность шелла, не?

Да, но у баша больше наворотов, позволяющих меньше исп. системные утилиты (coreutils)

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

Чем zsh лучше bash? Я так и не понял. Кроме того, что zsh нужно геморройно настраивать, так как .zshrc пустой. Фишки, типо автодополнения. Какие еще плюшки? В том числе, если на нем писать скрипты.

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