Если у вас есть реализация cron
, которая вообще документирует файл crontab
, вы должны использовать исторический вариант UNIX
. Уже более 30 лет единственным допустимым интерфейсом к утилите cron
является команда crontab
.
Это причина, по которой POSIX
вообще не документирует утилиту cron
, так как это деталь, специфичная для реализации.
Так что ведите себя корректно и используйте crontab -l
только для просмотра crontabs или crontab -e
для редактирования crontabs.
Если вы редактируете файл crontab, команда crontab
затем сохраняет файл crontab в определенном системном месте и информирует утилиту cron
о том, что файл crontab был изменен и его необходимо перечитать.
$ sed -r 's/.* ([^ ]+\.[^ ]+).* ([^ ]+)$/\1 \2/' orange
orange.5678 you
-r
использовать расширенные регулярные выражения s / old / new
replace old
с новым
.*
любое количество любых символов (некоторые символы)
за исключением некоторых символов
для ссылки позже при замене [^] +
некоторые символы, не являющиеся пробелом \.
буквальная точка $
конец строки \ 1
обратная ссылка на сохраненный шаблон , поэтому s /.* ([^] + \. [^] +) . * ([^] +) $ / \ 1 \ 2 /
означает соответствие чему-либо в строке вплоть до пробела, предшествующего некоторым непробельным символам до .
, а затем несколько непробельных символов после него (сохраняя эти символы по обе стороны от .
), затем сопоставьте любые символы и сохраните последний набор непробельных символов в строке и замените весь совпадают с двумя сохраненными шаблонами, разделенными пробелом
Надо посмотреть другой ответ @Zanna. Очень элегантно и демонстрирует всю мощь регулярных выражений.
Попробуйте это выражение с gawk
. Обычная awk не работает с группировкой.
^(?:\w+\s){0,}(\w+\.\w+)(?:\s\w+){0,}\s(\w+)$
Это работало для следующих вариантов
apple orange.5678 dog cat 009 you
apple apple grape.9991 pig cat piegon owl
grape.9991 pig cat piegon owl
Вот описание выражения.
/
^(?:\w+\s){0,}(\w+\.\w+)(?:\s\w+){0,}\s(\w+)$
/
g
^ asserts position at start of the string
Non-capturing group (?:\w+\s){0,}
{0,} Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
\s matches any whitespace character (equal to [\r\n\t\f\v ])
1st Capturing Group (\w+\.\w+)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
\. matches the character . literally (case sensitive)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
Non-capturing group (?:\s\w+){0,}
{0,} Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
\s matches any whitespace character (equal to [\r\n\t\f\v ])
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
\s matches any whitespace character (equal to [\r\n\t\f\v ])
2nd Capturing Group (\w+)
\w+ matches any word character (equal to [a-zA-Z0-9_])
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
$ asserts position at the end of the string, or before the line terminator right at the end of the string (if any)
Самый простой подход:
awk '{print $2, $6}' file.txt
Если ваш фактический вариант использования более сложен, чем указывает ваш вопрос, и вам требуется дополнительная логика (например, если это не , всегда 2-е и 6-е поля, которые вам нужны), отредактируйте свой вопрос , чтобы уточнить.
Если необходимо выполнить команду sed с регулярным выражением, то приведенный выше ответ покроет вас. Если вы открыты для альтернатив:
gv@debian: $ read -r a b c d e f<<<"apple orange.5678 dog cat 009 you" && echo "$b $f"
orange.5678 you
Если это строка в файле, замените <<< ". ... "
with
Для работы этого метода требуется IFS = пробел по умолчанию. Если в doube, примените IFS = ""
в начале.