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

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

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

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

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

  • Как захватить вывод из команды в сценарии оболочки
  • Все ли процессы Linux записывают EOF в stdout, когда они завершают / заканчивают завершение?
  • grep script - выводит строки одновременно в эхо
  • Перенаправить вывод ошибки grep в файл
  • Какой поток использует перцепция?
  • Выход находится в консоли, но не является частью stdout или stderr
  • Отправить копию вывода скрипта в файл
  • Как я могу получить версию vsftpd в переменной оболочки?
  • 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

    ls -l / proc / self | увеличение PID?

    Что такое опция «Загрузочный флаг» при установке дистрибутива?

    Rsyncing несколько файлов с пробелами в именах

    Gnome 3.22: отключить переключение клавиатуры клавиатуры + + shift

    Как обеспечить, чтобы Bluetooth был отключен после загрузки?

    gnome "switch user" ярлык или командная строка

    Создайте Linux Mint как ubuntu

    Как я могу печатать выходные данные при отключении от управляющего терминала?

    Включая каталоги в Locate на Mac OS X

    Как показать все файлы в каталоге, кроме тех, которые имеют определенное расширение и отображать их в нескольких столбцах?

    Не удается запустить php cli в webuser, но будет выполняться как root

    Я получаю «bash: …: нет такого файла или каталога», хотя исполняемый файл существует

    Авто логин для Ubuntu (или другого Linux) без GUI?

    Используя последовательности завитушек, не зная конечной точки

    получение дерева сборки ядра

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