私のローカルサーバーは、作成されたバックアップファイルのサイズを確認したいリモートサーバーの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
よりも使用する方がよいでしょう。stat
ssh
sftp
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
head
tail
最初の3行と3行のうち最後の行を印刷します。tr
繰り返されるすべてのスペースを圧縮し、タブに置き換えます。- そして
cut
5番目の単語が印刷されます。
答え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}'
探している列が見つかるまで列数を簡単に計算できます。