날짜 잘림 정밀도

날짜 잘림 정밀도

저는 여러 다른 시스템에서 빌드 진행 상황을 폴링하는 bash 스크립트를 사용하고 있습니다. 빌드가 완료되면 stat로그 파일을 생성하여 마지막 편집 시간을 찾은 다음, date빌드가 완료되면 사람이 읽을 수 있는 출력을 생성하는 데 해당 시간을 제공합니다.

이는 몇 가지 다른 시스템에서 실행되기 때문에 출력은 다음과 같습니다.

sys00 finished around:        2015-06-11 01:42:29.484345955 -0700
sys01 finished around:        2015-06-11 01:21:17.560101447 -0700
sys02 finished around:        2015-06-11 03:51:56 -0700
sys03 finished around:        2015-06-11 04:32:12 -0700
sys04 finished around:        2015-06-11 01:40:47.977893386 -0700
sys05 finished around:        2015-06-11 01:16:12.158137851 -0700

나의 첫 번째 우선순위는 그것들을 동일하게 보이게 만드는 것이었고, 첫 번째와 마지막 두 시스템의 추가적인 정밀도가 필요하지 않았기 때문에 그냥 잘라내고 싶었습니다. 나는 이것을하려고 노력했습니다 awk:

echo $TIME | awk '[0-9]{9} {gsub('', '[0-9]{9}')}' -

그러나 거의 성공하지 못했습니다. 나는 sed그것이 더 적절한 도구인지 결정할 만큼 충분히 익숙하지 않습니다. date이렇게 하지 말라고 지시할 수 있는지 잘 모르겠습니다 . date현재 사용하고 있는 명령 은 다음과 같습니다 .

COMMAND='date -r `stat -f "%m" '"$BASENAME"'/../logs/catTest*.log |& head -n1` +"%Y-%m-%d %H:%M:%S %z"'

( $BASENAME로그 파일을 찾는 데 사용하는 기본 경로는 어디에 있습니까?)

생리 후에 성가신 숫자를 제거하는 방법은 무엇입니까?

답변1

답을 얻으려면 sed이를 사용하여 소수점 이하 자릿수를 필터링할 수 있습니다.

sed 's/\.[0-9]\{1,\}//'

작동 방식:

  • \.텍스트와 일치합니다.
  • [0-9]\{1,\}하나 이상의 숫자와 일치합니다

결과 패턴은 "리터럴 .과 하나 이상의 숫자가 뒤따르는 일치"를 의미하며 이를 무엇이든 대체합니다.

답변2

귀하의 질문을 올바르게 이해했다면. 원하는 출력은

out.txt

sys00 finished around: 2015-06-11 01:42:29 sys01 finished around: 2015-06-11 01:21:17 sys02 finished around: 2015-06-11 03:51:56 sys03 finished around: 2015-06-11 04:32:12 sys04 finished around: 2015-06-11 01:40:47 sys05 finished around: 2015-06-11 01:16:12

awk를 사용하는 필드 구분 기호

앗 -F. '{print $1}' inputfile.txt | '{print $1}' awk -F- '{print $1, $2, $3}'

이런 출력을 원하시면 out2.txt

sys00 finished around: 2015 06 11 01:42:29 -0700 sys01 finished around: 2015 06 11 01:21:17 -0700 sys02 finished around: 2015 06 11 03:51:56 -0700 sys03 finished around: 2015 06 11 04:32:12 -0700 sys04 finished around: 2015 06 11 01:40:47 -0700 sys05 finished around: 2015 06 11 01:16:12 -0700

앗 -F. '{인쇄 $1}' tst.txt | '{인쇄 $1}' awk -F- '{인쇄 $1, $2, $3, "-0700"}'

답변3

잘못된 정보를 받으셨다니 놀랐습니다 stat -f "%m" .... 현재 버전의 명령을 복사하셨나요?

-f(파일 시스템) 대신 -c(형식 지정)를 사용하는 것 같습니다. stat에 제공한 파일 목록에 대한 마운트 지점을 가져온 다음 이를 단일 경로로 자른 다음 날짜 stat 마운트 지점과 형식을 제공합니다.

속도를 높이거나 단순화하기 위해 할 수 있는 일이 많이 있는데, 그 중 첫 번째는 날짜를 사용하지 않는 것입니다.

COMMAND='stat -fc "%y" '"$BASENAME"'/../logs/catTest*.log |& head -n1'

불행히도 이는 로케일에 따라 다르며 나노초를 포함하므로 다음을 사용할 수 있습니다.

COMMAND='LC_ALL=C stat -fc "%y" '"$BASENAME"'/../logs/catTest*.log |& head -n1|sed "s/\.[0-9]\+//"'

두 번째 옵션은 날짜가 없는 통화 통계입니다.

COMMAND='date `stat -fc "@%Y" '"$BASENAME"'/../logs/catTest*.log |& head -n1` +"%Y-%m-%d %H:%M:%S %z"'

나노초가 계속 표시되는 경우(표시되지 않아야 함, 버그 보고서를 제출하세요) 더 간단한 정규식을 사용하여 필터링할 수 있습니다.

COMMAND='date `stat -fc "@%Y" '"$BASENAME"'/../logs/catTest*.log |& head -n1` +"%Y-%m-%d %H:%M:%S %z"|sed "s/\.0\+//"'

작업 속도를 높일 수 있는 또 다른 방법(모든 로그 파일을 계산하거나 다른 작업을 생성하는 것이 더 빠른지에 따라 다름)은 stat 전에 파일을 필터링하는 것입니다.

COMMAND='ls "$BASENAME"'/../logs/catTest*.log|head -n1|LC_ALL=C xargs stat -fc "%y" |sed "s/.[0-9]+//'

관련 정보