#!/bin/bash if [[ $(cut -d, -f2 file.txt | grep '[0-9]' | sort -nr | head -1) -gt 1 ]]; then echo 'a number in the 2nd column is greater than 1.' else echo 'i am doing nothing.' fi
-121--184885-
Я рекомендую пакет
runit
илиdaemontools
, которые очень похожи. Это твердотельные инструменты, которые позволяют выполнять процессы непрерывно и запускать их автоматически.Это программное обеспечение запускается из сценариев inittab или rc и настраивается
runit
илиdaemontools
для запуска и мониторинга процессов.Вы хорошо контролируете все процессы, ведение журнала строится, и, поскольку эти пакеты запускают процессы и ждут их, автоматически перезапустят устаревшие процессы. Он также отслеживает быстрые перезапуски и дроссели в этом случае, в соответствии с параметрами, которые можно установить дополнительно.
Один из этих двух пакетов, вероятно, доступен в репозитории для вашей ОС (вы не упомянули, какой именно). Оба доступны в репозиториях Debian и Ubunut, и я знаю, что существует репо для CentOS.
Вот страница, на которой обсуждаются эти два варианта и другие: http://www.skarnet.org/software/s6/why.html
-121--114034-
Попробуйте:
{ echo To: my_email@domain.com echo From: from_email@example.com echo Subject: mov files greater than 1M echo find /path/to/folder/ -type f -size +1M -name "*.mov" } | ssmtp my_email@domain.com
Вам не нужен
printf
нанайти
.
$ sed '/\..*\./s/^[^.]*\.//' file
akamai.com
cloudflare.com
cdn.cloudflare.net
Скрипт sed
сначала сопоставляет строки, которые содержат не менее двух точек, используя регулярное выражение \..*\.
(, также мог быть написан[.].*[.]
). Для строк, соответствующих этому, выполняется замена, которая удаляет все до первой точки включительно.
Использование awk
, несколько длинное -закручивание по сравнению с указанным выше:
$ awk -F '.' -vOFS='.' 'NF > 2 { n=split($0, a); $0=""; for (i=2;i<=n;++i) $(NF+1)=a[i] } 1' file
akamai.com
cloudflare.com
cdn.cloudflare.net
Здесь, когда существует более двух полей, разделенных точками -, мы разбиваем текущую строку на точки, а затем повторно -создаем текущую запись из нее, пропуская первое поле. Замыкание 1
в конце приводит к печати каждой строки (, измененной или не измененной ).
Сокращение awk
аналогично решению sed
:
$ awk -F '.' 'NF > 2 { sub("^[^.]*\.", "") } 1' file
akamai.com
cloudflare.com
cdn.cloudflare.net
Вы можете подойти к этому, используя следующие методы:
perl -lpe '$_ = $1 if /\.(.*\..*)/' input-file.txt
при этом мы полагаемся на regex
, который обнуляется символом точки .
, который может видеть другую точку справа от него. Затем все, что находится справа, захватывается и становится доступным в $1
и вставляется в текущую строку. Параметр -p
для Perl
затем переносит это в stdout
, а также тот, который не совпал.
perl -F\\. -pale '$_ = join ".", splice @F, 1 if @F > 2' input.txt
Входной файл считывается строкой -за строкой -с помощью опции -p
, и автопечать также включается с помощью этой опции.
Каждая запись разбивается на точку .
, а отдельные поля, хранящиеся в массиве @F
, индексируются, начиная с 0
с помощью опции -a
.
-l
опция делаетRS = ORS = "\n"
Только когда у нас в массиве @F
больше 2 элементов, то есть в текущей записи было хотя бы 2 точки, мы выбираем такую запись для модификации.
Для такой записи функция splice @F, 1
удаляет элементы, начиная со 2-го и далее, и представляет их функции join
, которая затем соединяет их с помощью символа точки, который затем вставляется внутрь $_
, также известной как текущая запись..
Опция -p
выводит эту измененную текущую запись на стандартный вывод. Тот, который не изменился, в любом случае молча выводится на стандартный вывод.
Используя GNU sed
мы также можем выполнить задачу, не прибегая к захвату скобок:
sed -e
s/\./\n/2;T
y/\n./.\n/
s/\n/./2g
s/.*\n//
' input.file
Выход:
akamai.com
cloudflare.com
cdn.cloudflare.net