Выходной текущий день с использованием cal

Меня попросят вывести текущий день с помощью команды cal .

До сих пор я обнаружил, что до текущей даты есть символ _ . Я решил использовать grep здесь: cal | grep '\b_*' cal | grep '\b_*' , но он выводит всю неделю. Я пробовал несколько вариантов, но это не сработало.

На самом деле, есть также случай, когда текущий день имеет только одну цифру, поэтому мне кажется, что я должен использовать tr -d ' ' здесь.

Я не знаю, как объединить все эти команды вместе.

3 Solutions collect form web for “Выходной текущий день с использованием cal”

Когда вывод команды cal не является терминалом, он применяет подчеркивание бедных людей к сегодняшнему дню, который состоит из того, чтобы подчеркнуть символ подчеркивания и обратного пространства перед каждым символом, чтобы подчеркнуть. Вы можете видеть это, визуально отображая символы ( ^H означает control-H , который является символом обратного пространства):

 cal | cat -A cal | cat -vet 

или глядя на шестнадцатеричный дамп:

 cal | hd cal | od -t x1 

Итак, вам нужно обнаружить подчеркнутые символы и вывести их.

С GNU grep существует простой способ распечатать все совпадения регулярного выражения: используйте опцию -o . Символ подчеркивания совпадает с расширенным регулярным выражением _^H. где ^H – буквальный обратный символ, а не два символа ^ и H , и . это символ для печати. Вместо ввода символа обратного пробела вы можете положиться на то, что это единственный способ, которым cal использует символы подчеркивания в своем выходе. Поэтому достаточно выделить символы подчеркивания и оставить обратные пространства как непревзойденные символы.

 cal | grep -o '_..' 

Мы близки, но вывод содержит последовательность подчеркивания-обратного слэша, а цифры находятся на отдельных строках. Вы можете удалить все нецифровые символы (и добавить обратно завершающую новую строку):

 cal | grep -o '_..' | tr -d 0-9; echo 

В качестве альтернативы вы можете повторить шаблон _.. для соответствия нескольким подчеркнутым цифрам. Это оставляет подчеркивание в выходе, вы можете использовать tr или sed, чтобы отключить его.

 cal | grep -E -o '(_..)*' cal | grep -E -o '(_..)*' | tr -d '\b_' cal | grep -E -o '(_..)*' | sed 's/_.//g' 

Вы можете сделать это с помощью sed, но это не совсем просто. Sed предлагает простой способ печати только соответствующих строк (используйте параметр -n только для получения строк, которые напечатаны явно), но нет прямого способа распечатать несколько совпадений в строке. Один из способов решить эту проблему состоит в том, чтобы воспользоваться тем фактом, что имеется не более двух подчеркнутых символов и есть одна команда s для преобразования и вывода строк, содержащих один подчеркнутый символ, а другой для строк с двумя. Как и раньше, я не буду явно сопоставлять обратные пространства.

 cal | sed -n 's/.*_.\(.\)_.\(.\).*/\1\2/p; s/.*_.\(.\).*/\1/p' 

Альтернативный подход с sed, предполагающий, что на линии есть только один подчеркнутый сегмент, заключается в том, чтобы удалить все перед ним и все после него.

 cal | sed -n 's/^[^_]*_/_/; s/\(_..\)[^_]*$/\1/p' 

Это приводит к подчеркиванию; мы можем удалить их с третьей заменой.

 cal | sed -n 's/^[^_]*_/_/; s/\(_..\)[^_]*$/\1/; s/_.//gp' 

Правильный способ сделать это – просто использовать date :

 % date +%d 19 

Подчеркнутый символ подчеркивания – это не символ подчеркивания, а контрольный символ, отображаемый вашим терминалом. Если вы действительно хотите использовать cal , вам нужно выяснить, что это за элемент управления, и искать его. Вы можете использовать это, используя что-то вроде cal | xxd cal | xxd .

Другая проблема заключается в том, что cal выводит только этот управляющий символ, когда stdout является tty, поэтому вам нужно убедить его, что он один (рассмотрите script для этого).

Я не сейчас перед командой GNU cal, но это ближе к тому, что вы хотите:

 cal | grep -Eo '_[[:digit:]]+' | sed 's/_//' 

Grep -E говорит, что позволяет использовать расширенные регулярные выражения (для класса [[: digit:]]); флаг -o говорит, что выводит только соответствующую часть; команда sed удаляет символ подчеркивания.

Это способ cal + grep сделать это, но, как сказал Крис , обычный способ получить текущую дату – с помощью команды date .

  • Как сделать Nohup интерактивным shell-скриптом?
  • Как я могу получить версию vsftpd в переменной оболочки?
  • Есть ли способ раскрасить конфликты в git-выходе команд merge / rebase / patch / am?
  • выход хвостовой программы в файл в Linux
  • Несколько команд
  • Какой поток использует перцепция?
  • Изменение динамического названия tmux-окна до последней строки вывода команды
  • Труба не поднимает stdout
  • Перенаправить вывод ошибки grep в файл
  • Отправить копию вывода скрипта в файл
  • Ссылочный псевдоним Grep на nano. Ничего не происходит, когда команда выдается
  • Как захватить вывод из команды в сценарии оболочки
  • Linux и Unix - лучшая ОС в мире.