LINUX.ORG.RU
ФорумAdmin

Однострочник с условием

 ,


0

2

Нужно добавить в однострочник проверку, если дата больше текущей:

$sed '/ends/!d; s/ends 5 //; s/^\s*//; s/;//' /var/lib/dhcp/dhcpd.leases | date +%s -f -
1366963379
1366963380
1366963381
1366963381
1366963382
здесь вывожу список дат в unixtime

★★

sed считать не умеет.

d1=`date +%s`
while read d2; do
 
 if (( $d2 > $d1 )); then
  echo "дата $d2 больше текущей"
 fi
done < $TMP_FILE

как-то так.

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

только на однострочник не похоже

синтаксически нет разницы. IRL я пишу как раз однострочник, но для тебя я понятно расписал. Самому не свернуть что-ли?

используется $TMP_FILE

1. это не баг, а фича

2. не используй, если религия. Правда, если делать конвейером, то переменные не выползут из субшелла. Здесь это и не надо, но IRL это неудобно и криво.

drBatty ★★
()

sed '/ends/!d; s/ends 5 //; s/^\s*//;

тут кстати переход нужен. Я-бы написал так

sed -rn 's/ends 5 //; T; s/^\s+//; s/;//; p'

Команда T — условный переход, если замены не было. Переход без метки выполняется на конец sed-скрипта, к загрузке след. строки. Из-за ключа -n печать происходит только если переход не выполнен(последней командой p).

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

не понял, а в чем разница? типо быстрее выполнятся будет?

просто лишняя команда d. По быстродействию разница копеечная. Так как у меня — проще.

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

ммм... а -rn, T; и p - не лишнее команды? но я тебя понял, в сложных случаях это будет более наглядно...
и все таки как использовать без $TMP_FILE?

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

ммм... а -rn, T; и p - не лишнее команды?

не. Ты ведь хочешь обрабатывать только строчки с 'ends'? Ну вот я и убрал лишнюю проверку. А то у тебя оно дважды искалось (кстати, можно было-бы написать '/ends/!d;s///', sed компилирует выражение, и второй раз можно найти уже скомпилированное раньше, это быстрее. Хотя искать один раз очевидно ещё быстрее, чем два раза)

Что до -n, дык там по умолчанию p в конце каждой команды. А я написал: только тогда, когда оно надо.

Ключ -r не тормозит, он нужен просто для удобства записи регэкспов. Многие специальные символы нет нужды экранировать.

и все таки как использовать без $TMP_FILE?

ну вот так можно

$ while read s; do echo $s; done < <(ls -l)

тут вывод ls перенаправляется в цикл.

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

гуру слился? должен был быть нечитаемый однострочник на sed.

нет настроения.

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

спасибо, не знал...

http://tldp.org/LDP/abs/html/process-sub.html

это лучше...

запутать кого хочешь? Начнёшь ведь с себя…

В любом случае, сравнивать так не очень удобно, лучше (( d2 > d1 )) && echo… Хотя работает только в bash (в POSIX sh НЕ работает).

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

Ты хоть читаешь темы, в которые отвечаешь?

да. Синтаксически однострок эквивалентен многостроку. (за небольшим исключением). Т.е. применение && это дело вкуса.

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

Однострочник должен быть еще по возможности одновременно и коротким, и понятным. Простыня if-then-fi ни того, ни другого в однострочник не приносит. Вариант с (()) && echo тоже норм.

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

Однострочник должен быть еще по возможности одновременно и коротким, и понятным.

так не интересно. Однострочник должен содержать кучу команд, причём записанных одной буквой (sed, perl). Так, что-бы никто не понял.

Ну а сегодня мне лень такое писать, потому и юзаю bash.

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

лучше (( d2 > d1 )) && echo

Не вижу, чем лучше? [ d2 -gt d1 ] занимает ровно такую же длину в символах, притом ещё сохраняет совместимость с другими шеллами. Оба варианта – встроенные в баш, так что разница в скорости будет неощутима даже при стотысячном прогоне при равных условиях.

inb4 ((d2>d1)) – это кашка и ненужно.

Deleted
()
Последнее исправление: fargred (всего исправлений: 1)
Ответ на: комментарий от Deleted

Не вижу, чем лучше?

(( … ))

это не кашка, а арифметика в целых числах. Ну дело вкуса конечно. Хотя for (( i = 0; i < 100500; i++ )) работает куда как лучше конструкций for i in `seq 1 100500`, потому я и предпочитаю (( )) использовать.

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

привычка ставить пробелы. Извини. Мне с ними читать легче.

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