파일 이름의 일부를 추출하여 디렉터리 이름을 만들고 싶습니다. 여기 몇 가지 예가 있어요.
server.log.2016-03-20-14
→20160320
server-2016-03-17-13-16-Restart.log
→20160317
저는 HP-UX를 사용하고 있습니다.
답변1
이를 달성하기 위해 awk를 사용할 수 있습니다.
1)
echo server.log.2016-03-20-14 | awk -F'[.]' '{print $3}' | awk -F'[-]' '{print $1$2$3}'
2)
echo server-2016-03-17-13-16-Restart.log | awk -F'[-]' '{print $2$3$4}'
답변2
sed를 사용하여 정규식 검사에 파일 이름을 전달할 수 있습니다.
echo server.log.2016-03-20-14 | sed 's/server\.log\.\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1\2\3/g'
echo server-2016-03-17-13-16-Restart.log | sed 's/server-\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-Restart.log/\1\2\3/g'
예를 들어 더 엄격한 정규식이 필요한 경우 정규식을 사용하여 월을 설명할 수 있습니다.
0[0-9]\|1[12]
그날은
0[1-9]\|[12][0-9]\|3[01]
답변3
쉘의 문자열 조작 구성을 사용하여 이를 수행할 수 있습니다. 이를 위해서는 POSIX 셸이 필요하므로 이전 버전의 HP-UX를 실행하는 경우 Bourne 셸 대신 POSIX 셸(예: ksh)을 호출해야 할 수도 있습니다.
날짜를 구문 분석하는 방법을 완전히 지정하지 않았습니다. ????-??-??
각 ??
숫자의 첫 번째 발생이 원하는 날짜라고 가정합니다 .
p=${0#*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]}
s=${0#"$p"}; p=${0%"$p"}
p=${p#"${p%??????????}"}
year=${p%??????}; p=${p#?????}
month=${p%???}; day=${p#???}
echo "$year$month$day"
가장 읽기 쉬운 코드는 아니지만 작동합니다.