긴 목록 필드를 추출하는 방법은 무엇입니까?

긴 목록 필드를 추출하는 방법은 무엇입니까?

쉘 스크립트에서 파일의 액세스 날짜를 추출하고 싶습니다. 다음 스크립트를 작성해 보았지만 작동하지 않습니다. 내가 에코할 때방문일, 출력은 "직원"입니다.

file=$1
accessday=$(ls -lu $file | cut -d ' ' -f 6)

답변1

파싱되지 않음ls.

이것은 직업입니다 stat.

사람이 읽을 수 있는 형식으로 마지막 액세스 시간을 얻으려면 다음을 수행하십시오.

stat -c '%x' file.txt

에포크 이후 경과된 시간(초):

stat -c '%X' file.txt

답변2

ls -lu일반적인 출력 을 보면

-rw-r--r--  1 someuser  somegroup  74 Mar 29 05:21 filename

그룹 이름 앞에는 총 5개의 공백 문자가 있음을 알 수 있습니다. 따라서 명령에 지정한 필드 6은 cut그룹(귀하의 경우 "staff")을 반환합니다.

또한 방문일은 표기상 6번이 아닌 7번 필드가 됩니다.

한 가지 해결책은 을 사용하는 것입니다 awk. 이는 기본값으로 필드 구분 기호의 여러 발생을 처리하기 때문입니다.

accessday=$(ls -lu $file | awk '{print $7}')

답변3

귀하의 질문에 따라 stat를 사용하여 출력을 정규화한 다음 원하는 날짜만 표시하도록 잘라낼 것입니다.

stat -c '%x' FILENAME | cut -c 9,10

답변4

ls다음의 출력을 구문 분석합니다.어렵고 항상 가능하지는 않습니다. 이는 타임스탬프를 추출하려는 경우 때때로 필요한 대체 방법이지만(유일한 이식 가능한 방법: 모든 시스템에 명령이 있는 것은 아님 stat) 사람이 읽을 수 있는 타임스탬프를 얻게 됩니다.기계가 읽을 수 있는 형태로 변환하기 어려움. 최소한 어려운 부분을 수정하십시오. 사용자 및 그룹 필드를 생략하는 전달 -o-g옵션(일부 시스템에서는 이러한 필드에 공백이 포함되어 출력에서 ​​구분이 불가능할 수 있음 ls). 그런 다음 타임스탬프는 필드 4-6(1부터 시작하여 번호가 매겨짐)을 차지합니다.

변수 확장에 대한 큰따옴표를 잊지 마세요..

access_time=$(ls -dlogu -- "$file" | awk '1 {print $4, $5, $6}')

해당 월의 날짜를 원하는 경우 지난 6개월 이내의 타임스탬프인지 여부에 따라 두 가지 출력 형식을 구별해야 합니다. 안정적인 출력 형식을 위해 로캘을 C로 설정합니다. 이 형식에서는 해당 월의 날짜가 항상 두 번째 타임스탬프 필드입니다.

access_day=$(ls -dlogu -- "$file" | awk '1 {print $5}')

관련 정보