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すべての内容が1行に印刷されます。引用符を追加すると、操作が簡単になります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標準ツールを組み合わせて使用​​できます。

次の2つのコマンドは同じです。

echo "$file_listing"  | awk 'NR==3{print $5}'
echo "$file_listing"  | head -n3 | tail -n1 | tr -s ' ' '\t' | cut -f5
  • headtail最初の3行と3行のうち最後の行を印刷します。
  • tr繰り返されるすべてのスペースを圧縮し、タブに置き換えます。
  • そしてcut5番目の単語が印刷されます。

答え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}'探している列が見つかるまで列数を簡単に計算できます。

関連情報