sed удалить все до первого периода включительно, если на этой строке более одного периода, и сделать это для всего файла

#!/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 на найти .

4
27.07.2018, 20:30
2 ответа
$ 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
13
27.01.2020, 20:46

Вы можете подойти к этому, используя следующие методы:

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
1
27.01.2020, 20:46

Теги

Похожие вопросы