"디렉터리, 파일 이름, 권한, 그룹 및 소유자, 크기, 마지막 액세스 날짜, 마지막 수정 날짜, 마지막 변경 날짜"를 포함하는 수백만 개의 레코드 파일이 있습니다. 마지막 행(파일) 액세스 날짜와 마지막 수정 날짜를 가져와야 합니다. 2012년보다 작거나 같습니다.
예:
23 8 drwx------ 16 userid grpid 2048 2009-06-25 20:42 2011-03-03 17:27 2011-03-03 17:27 /path/dir
66738 8 drwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2015-07-07 17:48 2010-03-05 11:49 /path/dir/dir2
90354 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2014-03-05 16:00 /path/dir/dir2/file1
89743 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2010-03-05 16:00 /path/dir/dir2/file2
답변1
가장 짧은 awk 코드는 다음과 같습니다.
awk '$3 ~ /^-/ && $8 < "2013" && $10 < "2013"' file
이는 테스트를 통과한 레코드에 대해 기본 작업(인쇄)을 사용합니다.
또한 다음과 같은 어휘 순서를 활용합니다.
"2012-12-31" < "2013"
사실이고"2013-01-01" < "2013"
가짜다
답변2
출력에서 일치하는 행을 얻으려면 예제 입력을 수정하세요.
$ cat ip.txt
23 8 drwx------ 16 userid grpid 2048 2009-06-25 20:42 2011-03-03 17:27 2011-03-03 17:27 /path/dir
66738 8 -rwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2011-07-07 17:48 2010-03-05 11:49 /path/dir/dir2
90354 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2014-03-05 16:00 /path/dir/dir2/file1
89743 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2010-03-05 16:00 /path/dir/dir2/file2
$ grep -P '^(\S+\s+){2}-(?1){5}(\d\d(0\d|1[0-2]))(?1){2}(?2)' ip.txt
66738 8 -rwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2011-07-07 17:48 2010-03-05 11:49 /path/dir/dir2
(\S+\s+)
공백이 아닌 텍스트 뒤에 공백이 옵니다.{5}
아니면{2}
여러번 반복하라고 해주세요\d\d(0\d|1[0-2])
연도2012
또는 그 이전 (연도의 첫 두 자리가 를 초과하지 않는 것으로 가정20
)(?1)
지칭하고(\S+\s+)
또(?2)
지칭한다(\d\d(0\d|1[0-2]))
perl
해결책은 다음과 유사합니다.글렌의 대답
$ perl -ae 'print if $F[2] =~ /^-/ && $F[7] < 2013 && $F[9] < 2013' ip.txt
66738 8 -rwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2011-07-07 17:48 2010-03-05 11:49 /path/dir/dir2
> output.txt
결과를 다른 파일에 저장하려면 명령 끝에 추가하십시오 .
답변3
AWK와 Operator가 나를 도와주었습니다. 디렉터리가 아닌 파일만 필요하므로 파일을 필터링하여 "-"로 시작하는 권한 열을 찾았습니다.
고양이 파일 이름 | awk '($3 ~ /^-/)'
그런 다음 sed 사용에만 관심이 있으므로 날짜 형식을 줄여 연도를 나타냅니다.
고양이 파일 이름 | awk '($3 ~ /^-/)' sed 's/-[0-9][0-9]//g'
이제 awk AND 연산자가 두 열을 비교하고 예상한 결과를 얻습니다.
고양이 파일 이름 | awk '($3 ~ /^-/)' | sed 's/-[0-9]//g' | sed 's/-[0-9][0-9 ]//g' | awk ' $8 < 2013 && $10 < 2013 ' > files_older_2012
다들 감사 해요. 이곳은 제가 가본 곳 중 최고의 장소입니다.