SFTP 세션에서 반환된 "ls -l" 출력에서 ​​파일 길이를 추출합니다.

SFTP 세션에서 반환된 "ls -l" 출력에서 ​​파일 길이를 추출합니다.

내 로컬 서버에서는 생성되는 백업 파일의 크기를 확인하려는 원격 서버의 stfp에만 액세스할 수 있습니다. 그래서 로그인하고 "ls -l" 명령을 실행하기 위해 bash를 작성할 수 있었습니다.

file_listing=$(sftp connection_string:Path/to <<<$'ls -l file.sql.gz')

...생산하다:

$ echo $file_listing
Changing to: /Path/to sftp> ls -l file.sql.gz -rw------- ? 19009 19009 7834147822 Oct 19 23:02 file.sql.gz

bash 기본 문자열 조작이나 grep 또는 기타 도구를 사용하여 이 문자열의 파일 크기 부분을 추출할 수 있기를 원합니다. 이 경우7834147822

나는 grepping을 시도하고 패턴을 얻기 위해 grepping을 시도했습니다.

size_pattern='([0-9]{1} {1}[0-9]+ {1}[A-Z]{1})'

아니면...

echo $file_listing  | egrep -o '[[:digit:]]\{1\}[[:blank:]][[:digit:]]\+[[:blank:]][A-Z]\{1\}'

...또는 다른 것. 작동하면 " 9 7834147822 O"가 표시될 것이라는 것을 알고 있지만 파일 크기로 사용하기 전에 문자열 조작을 관리하여 양쪽 끝에서 문자와 공백을 제거할 수도 있다고 생각합니다.

말이 돼? 누구든지 아이디어가 있습니까?

최고의 소원, 운동복

답변1

참조 변수를 사용하지 않으면 echo모든 내용이 한 줄에 인쇄됩니다. 따옴표를 추가하면 작업이 더 쉬워집니다 grep.

그러나 나는 여전히 다음을 선호합니다 awk.

echo "$file_listing"  | awk 'NR==3{print $5}'

또 다른 흥미로운 접근 방식은 다음과 같습니다 set.

set -- $(tail -n1 <<< "$file_listing")
echo $5

다음을 통해 액세스할 수 있는 경우 다음을 ls -l구문 분석하는 것보다 사용하는 것이 더 좋습니다.statsshsftp

ssh user@server 'stat --format %s /path/to/file'

답변2

마음에 들지 않으면 awk표준 도구를 조합하여 사용할 수 있습니다.

다음 두 명령은 동일합니다.

echo "$file_listing"  | awk 'NR==3{print $5}'
echo "$file_listing"  | head -n3 | tail -n1 | tr -s ' ' '\t' | cut -f5
  • headtail처음 세 줄과 이 세 줄 중 마지막 줄을 인쇄 합니다 .
  • tr반복되는 모든 공백을 압축하고 탭으로 대체합니다.
  • 그리고 cut다섯 번째 단어가 인쇄됩니다.

답변3

AWK는 당신의 친구입니다. AWK는 텍스트 줄을 살펴보고 발견된 공백에 따라 열로 분할합니다. 각 열에는 숫자 자리 표시자 $1, $2 등이 있습니다. 내 컴퓨터에 9개의 열을 생성하면 ls -l이 명령을 사용하여 필요한 것을 얻을 수 있습니다.

ls -l file.sql.gz | awk '{print $5}'

K/MB/GB 단위로 사람이 읽을 수 있는 크기를 원하는 경우ls -lh

귀하의 예에서 텍스트 줄에는 "Change to:..."와 같은 정보도 포함되어 있습니다. AWK가 수신하는 전체 줄을 볼 수 awk '{print $NF}'있으며 찾고 있는 열을 찾을 때까지 열 수를 간단히 계산할 수 있습니다.

관련 정보