Why printf Instead of echo?
While echo is commonly used for printing text, printf provides better control over:
-
Newlines
-
Alignment
-
Field width
-
Numeric formatting
-
Writing formatted output to variables
Because of this, printf is preferred in production shell scripts.
Basic Usage of printf
Printing Without a Newline
[root@oel01db ~]# printf 'hello world'
hello world[root@oel01db ~]#
Notice the prompt appears immediately after the output because no newline was printed.
Printing With a Newline
[root@oel01db ~]# printf 'hello world\n'
hello world
[root@oel01db ~]#
\n explicitly prints a newline.
Printing Multiple Values
Using %s Placeholder
%s represents a string placeholder.
[root@oel01db ~]# printf '%s \n' hi there
hi
there
[root@oel01db ~]#
Each argument is printed using the same format.
Printing Multiple Strings on One Line
[root@oel01db ~]# printf '%s %s\n' hi there
hi there
[root@oel01db ~]#
Here:
-
First
%s→hi -
Second
%s→there
Controlling Field Width
One powerful feature of printf is field width formatting.
Right Alignment (Default)
[root@oel01db ~]# printf '%10s %10s\n' hi there
hi there
[root@oel01db ~]#
10 means minimum width of 10 characters.
If the string is shorter, spaces are added to the left.
Left Alignment
[root@oel01db ~]# printf '%-10s %-10s\n' hi there
hi there
[root@oel01db ~]#
- tells printf to left align the text.
Visualizing Padding
[root@oel01db ~]# printf '<%-10s> <%-10s>\n' hi there
<hi > <there >
[root@oel01db ~]#
Using <> helps visualize extra padding spaces.
Dynamic Width Formatting
Instead of hardcoding the width, we can pass it dynamically.
[root@oel01db ~]# printf '<%-*s>\n' 8 there
< there>
[root@oel01db ~]#
* tells printf:
Take the field width from the next argument.
Example again:
[root@oel01db ~]# printf '<%-*s>\n' 8 there
<there >
[root@oel01db ~]#
This is extremely useful when building tables dynamically.
Working with Numbers
printf also supports numeric formatting.
Basic Integer
[root@oel01db ~]# printf '%d\n' 77
77
[root@oel01db ~]#
%d prints an integer.
Minimum Width
[root@oel01db ~]# printf '%5d\n' 77
77
[root@oel01db ~]#
Number is padded with spaces.
Left Align Numbers
[root@oel01db ~]# printf '%-5d\n' 77
77
[root@oel01db ~]#
Zero Padding
[root@oel01db ~]# printf '%05d\n' 77
00077
[root@oel01db ~]#
This is useful for:
-
log file numbering
-
formatted IDs
-
timestamps
Writing printf Output to a Variable
printf has a very useful -v option.
Instead of printing to stdout, it stores the result in a variable.
[root@oel01db ~]# printf -v var 'hello %s' mahesh
[root@oel01db ~]#
[root@oel01db ~]#
[root@oel01db ~]# echo $var
hello mahesh
[root@oel01db ~]#
This is cleaner and faster than command substitution.
Example you often see:
var=$(printf 'hello %s' mahesh)
But printf -v avoids spawning a subshell.
Practical Use Cases of printf in Shell Scripts
1. Creating Table-Like Output
Example:
printf '%-10s %-10s\n' NAME SCORE
printf '%-10s %-10d\n' Alice 90
printf '%-10s %-10d\n' Bob 80
Output:
NAME SCORE
Alice 90
Bob 80
2. Formatting Log Messages
printf '[%s] %s\n' "$(date +%T)" "Service started"
Example output:
[10:22:45] Service started
3. Zero-Padded File Numbers
Useful for sequential files:
printf 'file_%03d.log\n' 1
Output:
file_001.log
4. Formatting Floating Numbers
Another useful format specifier:
printf '%.2f\n' 3.14159
Output:
3.14
This is useful in monitoring scripts or calculations.
No comments:
Post a Comment