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

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

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

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

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

  • Как отправить вывод на экран и почту?
  • Подробный вывод в лог-файле и простой вывод на экран?
  • Труба не поднимает stdout
  • Автоматическая копия для сканирования нескольких URL-адресов
  • Отправить копию вывода скрипта в файл
  • Как сделать Nohup интерактивным shell-скриптом?
  • wget-файл, протоколирование вывода и отображение вывода в командной строке
  • Как вывести stderr / stdout моего скрипта как в файл, так и в консоль?
  • 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 .

    Interesting Posts

    Могу ли я открыть следующее непрочитанное сообщение в mutt с помощью одного ключа?

    Почему этот скрипт не принимает два аргумента?

    Удалить файлы с длиной 0 в bash

    Есть ли способ разместить комментарий в файле, который vim будет обрабатывать, чтобы установить тип файла?

    Jailbreaking HDTV

    Как я могу получить доступ к пунктам меню, подобно hud (единство)?

    Как установить конкретную версию?

    Создать имя каталога на основе других других каталогов

    Каковы различные способы отображения сообщения в оболочку bash после входа пользователя в систему?

    Примерное значение для nautilus (файловый менеджер) подключается к настраиваемому местоположению службы

    Объяснение для 'sed'

    Debian не будет полностью закрыт

    В чем преимущество компиляции собственного ядра Linux?

    Делает ли / proc / net / udp все капли, которые происходят между подключением Ethernet и моим приложением?

    Проблема с разрешением экрана в Fedora 17 в Oracle VirtualBox 4.2

    Linux и Unix - лучшая ОС в мире.