날짜와 관련된 줄을 뽑아보세요

날짜와 관련된 줄을 뽑아보세요

sort첫 번째 필드 (예: 월/일(예: 02-20)) 로 편집된 텍스트 파일이 있습니다.

grep저는 텍스트 파일에 사용해 왔지만 date오늘 날짜를 처리하려면 스크립트에서 명령을 사용하는 것이 가장 쉽습니다.

지난 3일, 오늘 날짜, 다음 5일의 데이터를 추출하고 싶은데... 말일/다음 달을 처리하는 쉬운 방법을 모르겠습니다. 저는 이것을 하드코딩할 수 있을까요? 하지만 저는 항상 문제를 해결하는 우아한 방법을 찾고 있으므로 제안 사항을 찾고 있습니다.

나는 스크립트의 이식성을 최대한 높이기 위해 일반 명령을 사용하는 것을 선호합니다.

즉, 이식 가능하다는 것은 Linux/GNU 시스템에만 제한된다는 뜻이 아닙니다(및/또는 모든 것을 실행하려면 특정 유틸리티를 설치해야 함). 현재 저는 BSD 시스템을 사용하고 있으며 대부분의 UNIX 버전(Solaris, 어쩌고 저쩌고)을 사용해 작업해 왔으며 앞으로도 그럴 것입니다.

나는 다른 종류의 UNIX를 사용할 때마다 패키지를 설치하는 것을 기억하는 대신 좀 더 복잡한 프로그램/스크립트를 사용하고 매우 기본적인 도구를 사용할 것입니다(스크립트 디렉토리에서 scp를 사용할 수 있고 작동할 때 허용할 때).


참고: 현재 date-d 플래그는 일광 절약 시간을 설정합니다. :)

 -d dst  Set the system's value for Daylight Saving Time.

좋아, 방금 파일의 데이터 유형에 대한 예(요청한 대로)를 제공했지만(obvs 훨씬 더 큼) 극단적인 경우는 제공하지 않았습니다. 이것은 극단적인 경우입니다. 즉, 월말 테스트에서 각 달(또는 4가지 유형의 달: 30, 31, 28, 29)을 프로그래밍하지 않고도 월말 기간을 처리하는 방법입니다.

01-01   Something To Do Here    Notes that may run for a really long time
02-05   On the 5th of the Month         Do this other thing, because of X
02-06   The day after           Do this cleanup stuff
03-15   The Ides                Remember, remember the Brutus of December
03-29   Edge                    Does this show up on the 1st of April?
03-30   Edge2                   Does this show up on the 1st and 2nd?
03-31   Last day in the month   Shows?
04-01   Edge                    Does this show on 31st?  Or does it only show 03-35?

답변1

GNU 날짜를 사용하면 및 -d같은 옵션에 대한 문자열을 제공할 수 있습니다 . 이 옵션을 사용하면 파일이나 파이프에서 이러한 문자열을 읽을 수 있습니다. 따라서 GNU를 사용 하고 다음을 수행하십시오 .-2 days5 days-fdatebash

printf '%d days\n' {-2..5} | date -f - +%m-%d | grep -f - in_file

고쳐 쓰다

이것이 허용 된다면 tcl날짜를 인쇄하는 스크립트는 다음과 같습니다.

#!/usr/bin/tclsh

set now [clock seconds]

for {set n -2} {$n<=5} {incr n} {
  set out_date [clock add $now $n days]
  puts [clock format $out_date -format %m-%d]
}

출력을 파이프로 연결하면 됩니다 grep -f -.

답변2

글쎄, 여기에 그 일을 하는 것처럼 보이는 라이너가 있습니다...

dt=$(date +%m-%d);for i in {-2..5}; do grep "$(echo "$dt"|awk -F"-" -v count=$i '{print $1"-0"$2+count}')" mtest; done

.bashrc에 추가하여 기능으로 만들 수 있습니다.

todolist(){  dt=$(date +%m-%d);for i in {-2..5}; do grep "$(echo "$dt"|awk -F"-" -v count=$i '{print $1"-0"$2+count}')" $1; done; }

그럼 전화하면 돼

todolist whateverthefilename.txt

예쁘지는 않지만 귀하의 데이터로 테스트했는데 작동합니다.

$ echo -e "01-01   Something To Do Here    Notes that may run for a really long time\n02-05   On the 5th of the Month         Do this other thing,\nbecause of X\n02-06   The day after           Do this cleanup stuff\n03-15   The Ides                Remember, remember the Brutus of December">> mtest

$ dt=02-05; for i in {-2..5}; do grep "$(echo "$dt"|awk -F"-" -v count=$i '{print $1"-0"$2+count}')" mtest; done
02-05   On the 5th of the Month         Do this other thing,
02-06   The day after           Do this cleanup stuff

답변3

당신은 그것을 사용할 수 있습니다touchPOSIXLY 테스트날짜 문자열의 유효성.

여기서는 몇 가지 옵션을 사용하겠습니다.

  • -c
    • 지정된 것을 생성하지 마십시오문서존재하지 않는 경우. 이 상황에 대한 진단 메시지를 작성하지 마십시오.
  • -t

    • 현재 시간 대신 지정된 시간을 사용합니다. 옵션 인수는 다음 형식의 10진수여야 합니다.

      [[CC]YY]MMDDhhmm[.SS]
      
    • 시간을 파일의 타임스탬프로 표현할 수 없는 경우 touch오류 상태로 즉시 종료되어야 합니다.

    • [[CC]YY]필드는 선택 사항입니다.

예를 들면 다음과 같습니다.

testtime()
        if      command -v touch >&2
        then    touch -c ''
                eval '  touch -ct"$1" ""
                        [ "$?" = '"$? ]"
        else    { touch; } 2>&3
        fi      3>&2 2>/dev/null

휴대용 물건을 다루는데 꽤 세심한 배려가 있는 것 같아요. GNU 및 Heirloom을 사용한 테스트에서(솔라리스) touch, GNU 도구는 나쁜 날짜에 대해 1을 반환하고 좋은 날짜에 대해 0을 반환하지만 Heirloom 버전은 각각 2와 1을 반환합니다. 나는 이전 Solaris 도구의 동작이 사양의 이론적 근거에서 구체적으로 참조되었다고 확신하며 다음을 발견했습니다.

  • touch지정되어 있고 파일이 존재하지 않는 경우 하나 이상의 기록 구현에서 종료 코드를 증가시켰습니다 . -c이 볼륨 POSIX.1-2008에서는 오류가 발생하지 않는 경우 종료 상태 0이 필요합니다.

내 가보 도구의 다양한 버전의 동작을 비교했을 때 더욱 확신이 들었습니다. 기본 컬렉션 중 하나(원래 컬렉션과 최대한 유사하게 작동하고 최신 시스템에서도 유용하도록 설계됨)는 위에서 설명한 대로 2와 1을 반환하는 컬렉션입니다. 그러나 /usr/heirloom/bin/posix2001/touch표준 준수를 위해 필요에 따라 수정된 실행 파일을 사용하면 GNU 도구와 정확히 동일한 결과가 반환됩니다.

어쨌든 이 함수는 touch빈 파일 피연산자에 대한 초기 호출 결과를 ''비교하기 때문에 이전 Solaris, 수정된 Solaris 및 GNU 동작을 처리합니다.(이건 절대 존재하지 않습니다)같은 날짜에 대한 두 번째 호출을 반대하고 좋은 날짜인 경우 0을 반환하고 나쁜 날짜인 경우 1을 반환합니다. 찾을 수 없으면 touch127을 반환하고 stderr에 씁니다.

사용 방법:

testtime MMDD0000 && echo good date || echo bad date

...어디mm그리고DD테스트하려는 날짜를 나타내는 2자리 10진수 문자열입니다. 이 방법으로 유효 시간을 확인할 수도 있습니다..S초 필드.

답변4

어제 첫 번째 답변을 게시했는데 잠이 너무 부족했습니다. 나는 돌아왔고 다시 시도할 준비가 되어 있다. 날짜를 물어보려고 하기보다는 내가 너무 똑똑하다고 생각해서 돌아가서 다시 생각해 보았습니다.

todolist(){ for i in {-2..5}; do grep "$(date -d "${date} +$i days" +%m-%d)" $1 ; done; };

.bashrc에 코드 한 줄을 추가하고 파일을 입력하면 됩니다.

이번에는 날짜가 모든 일을 하게 했습니다. 알겠어요여기서부터 팁. 그러면 오늘부터 원하는 일수가 추가되어 파일이 원하는 형식으로 출력됩니다.

date -d "${date} +$i days" +%m-%d)"

위 함수는 이제 하드코딩된 값을 사용하지 않고도 작동합니다.

관련 정보