La canalización de la salida a mail
no es correcta. Está redirigiendo la salida a un archivo, por lo que no se enviará nada a la canalización. Y cuando usa una tubería, los dos comandos se ejecutan simultáneamente, por lo que mail
no espera a que termine el primer comando.
Ejecútelos secuencialmente con ;
.
Y touch
no produce ningún resultado. Si desea un mensaje que registre que el trabajo cron se realizó correctamente, debe escribirlo explícitamente.
50 * * * * root if touch /home/text_created; then echo "Touch successful"; else echo "Touch failed"; fi >> /home/log_crontab.txt 2>&1; mail -s "Email Subject" -a "/home/log_contab.txt" this_is_my_email
попробуйте с:
grep -o '^[^+]*+[0-9]\+' infile
[^+]*+
соответствует всем, пока не будет найдено первое +
, за которым следует еще одна -или -цифра[0-9]\+
Командная строка:
$ perl -lne 'print /^(.*?\+\d+)/' input.txt
Это даст вам нужную информацию из ввода.
Рабочий:
/^(.*?\+\d+)/
Регулярное выражение должно извлекать все до первого вхождения символа плюс, за которым следует по крайней мере один символ цифры. BOL
через символ вставки ^
, очевидно, что может произойти только одно совпадение. print
. -lne
предназначены для запуска Perl
кода, указанного в опции -e
, в каждой строке входного файла. -n
заставляет perl ничего не печатать, если об этом специально не попросят. Выход:
United Kingdom +44
United States Virgin Islands +1
Поскольку вы говорите, чтопробел является разделителем, используемым в вашем файле, вы должны иметь возможность использовать
cut -d ' ' -f 1-5 filename
для извлечения пяти первых столбцов из файла.
Для заданных данных это дает
United Kingdom +44
United States Virgin Islands +1
... но я предполагаю, что это только случайность, так как страна с более чем двумя словами в названии будет охватывать несколько полей (, а не только два ).
Более надежный метод с использованием sed
для удаления всего после первого набора цифр в каждой строке (, т. е. всего после кода страны):
sed 's/\([[:digit:]][[:digit:]]*\).*/\1/' filename
или,
sed 's/\([[:digit:]]\{1,\}\).*/\1/' filename
или, с -E
и расширенным регулярным выражением,
sed -E 's/([[:digit:]]+).*/\1/' filename