LoginSignup
1
0

More than 3 years have passed since last update.

【Linux】ハイフンをいっぱい出したかっただけなのに【printfコマンド】

Last updated at Posted at 2021-04-09

初めに

実務で使ったコマンドの使い方を備忘録的にまとめます。
基本的な使い方は色んな方が書かれているので簡単に、
使っていて気付いた部分を重視して記述します。
実際の動きを見た推測等を含むため、仕様的に間違いがありましたら教えていただけると幸いです。

printfコマンドとは

データを整形して、表示するコマンド。
整形して表示とは、

$ printf "%s" penpen
penpen[root@nagisa]

「""」の中でフォーマットを指定して、整形して表示しています。
実行結果を見て分かる通り、改行はしません。回り込んじゃってますね。

改行したい場合は「\n」をつけてあげます。

$ printf "%s\n" penpen
penpen

データを整形ってよくわからないんだけど?

$ printf "%x\n" 255
ff

「%x」でデータ(引数)の「255」のフォーマットを16進数に指定して、整形してあげています。
出力結果はしっかり16進数で表示されていますね。

使い方備忘録

ここからは実務で使ったやりかたの備忘録です。
参考程度にご覧ください。

ハイフンをいっぱい出したい!!

実務でシェルスクリプトを作る過程で、printfコマンドの動きを確認していました。
ハイフンを量産して区切りでも作ってみようか。

ハイフン量産方法の例

$ printf "%s-" {0..60} | tr -d '[0-9]' | awk '{print}'
-------------------------------------------------------------
$ printf "%s" {0..60} | sed -e s/[0-9]/-/g -e s/$/\\n/
----------------------------------------------------------------------------------------------------------------
$ printf "%.s-" {0..60} | awk '{print}'
-------------------------------------------------------------

ただハイフンを量産するだけには見合わない労力を費やした気がします。
そもそもこのやり方たちがメジャーなのか不明です。

printfコマンドの使い方なので、他のコマンドの説明は先に簡単に済ませます。
「tr」「sed」これらのコマンドは文字を置換、削除するコマンドです。
・trコマンド: 正規表現で数字を指定し削除。
・sedコマンド: 正規表現で数字を指定しハイフンに置換。
どちらのコマンドでも最後に改行を差し込んでいます。意外と奥が深いひと手間。

3つめのコマンドはシンプルで美しいです。
printfコマンドの精度を利用して、文字列を表示しないやり方です。
最小フィールド幅と精度は奥が深そうなので、別記事にして勉強してみるのもいいかもしれません。

printfコマンドで繰り返し

話が脇道に逸れましたが、本題はprintfコマンドを使って、文字列を繰り返し出力できる使い方です。

$ printf "%s" {0..10} | awk '{print}'
012345678910

注目していただきたいのは
「{0..10} 」
この部分。
brace expansion(ブレース展開)というようで、
出力結果を見て分かる通り、ここでは0から10の数字を展開してprintfコマンドに渡しています。
この展開を利用して、ついでに数字にハイフンをつけて、先述したコマンドで数字を置換、削除します。回りくどい。
ハイフンをつけてみると

$ printf "%s-" {0..10} | awk '{print}'
0-1-2-3-4-5-6-7-8-9-10-

こんな感じ。
ハイフンが各数字にくっ付いていますので、
「012345678910」という文字列を渡しているのではなく、0から10まで繰り返していると推察できます。

実は最初はエラーが出た

実は最初は上手くいきませんでした。

$ printf "-%.s" {0..10} | awk '{print}'
bash: printf: -%: invalid option
printf: usage: printf [-v var] format [arguments]

違いが判りますでしょうか。

ハイフンを数字の前につけようとすると怒られてしまいます。
エラー内容によると「-%」はオプションとして無効だそうです。
「""」で囲っているのに文字列として認識せず、オプションとして認識されているのでしょうか。
「""」を展開して解釈してくれているみたいなのですがよくわかりません。どなたかご教授を。。。

とにかく、正しい使い方を教えてくれているので実際に使ってみます。

$ printf -v var "%s" penpen
$ echo ${var}
penpen

「-v」というオプションで「var」という変数に、文字列を整形して格納しています。
このような使い方はしたことがないので詳しくはわかりませんが。。。

ではここでエラーから逆算した使い方を実践してみましょう。

$ printf "-v" var "%s" wanwan
$ echo ${var}
wanwan

正常終了し、「var」の値も書き換わっています。
オプションを「""」で囲んでもちゃんと認識してくれました。

実は解決策もあった

先述した通り、ハイフンを数字の前につけるとエラーになるのですが、
ハイフンをエスケープすることで回避できます。

$ printf -- "-%s" {0..10} | awk '{print}'
-0-1-2-3-4-5-6-7-8-9-10

「--」をつけることで、後の「-」をエスケープできます。
しっかりハイフンが数字の前に付いてくれていますね。
このようなエラーは滅多に出会うことはなさそうですが、もしハマったら中々抜け出せなさそうな沼の予感がします。

まとめ

printfコマンドで色々遊んでみました。
労力に見合うほど得るものがあったのかは疑問ですが、楽しかったからヨシッ。

この記事の説明には不足、間違い、推測違いがあるかもしれません。
是非教えて頂ければ新たな学びとなりますので、どうぞよろしくお願いします。

最後に

ハイフンのエスケープは他のコマンドでも面白い動きが確認できたので、また記事にしたい思います。

[追記] trコマンドでもハイフンで遊んでみました!
【Linux】trコマンド使ってみた【trコマンド】

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0