commands:builtin:printf

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
commands:builtin:printf [2012/08/15 04:34]
ormaaj Add the extra %b escapes.
commands:builtin:printf [2016/11/30 15:39] (current)
medievalist [differences from awk printf]
Line 30: Line 30:
 Thus, a typical ''​printf''​-call looks like: Thus, a typical ''​printf''​-call looks like:
 <​code>​ <​code>​
-printf "​Surname:​ %s\nName: %s\n" "​$SURNAME"​ "$LASTNAME"+printf "​Surname:​ %s\nName: %s\n" "​$SURNAME"​ "$FIRSTNAME"
 </​code>​ </​code>​
 where ''"​Surname:​ %s\nName: %s\n"''​ is the format specification,​ and the two variables are passed as arguments, the ''​%s''​ in the formatstring points to (for every format specifier you give, ''​printf''​ awaits one argument!). where ''"​Surname:​ %s\nName: %s\n"''​ is the format specification,​ and the two variables are passed as arguments, the ''​%s''​ in the formatstring points to (for every format specifier you give, ''​printf''​ awaits one argument!).
Line 106: Line 106:
 |''​%a''​|Interprets the associated argument as **double**, and prints it in the form of a C99 [[http://​www.exploringbinary.com/​hexadecimal-floating-point-constants/​ | hexadecimal floating-point literal]].| |''​%a''​|Interprets the associated argument as **double**, and prints it in the form of a C99 [[http://​www.exploringbinary.com/​hexadecimal-floating-point-constants/​ | hexadecimal floating-point literal]].|
 |''​%A''​|Same as ''​%a'',​ but print it like ''​%E''​| |''​%A''​|Same as ''​%a'',​ but print it like ''​%E''​|
-|''​%(FORMAT)T''​|output the date-time string resulting from using ''​FORMAT''​ as a format string for ''​strftime(3)''​. The associated argument is the number of seconds since Epoch, or ''​-1''​ (current time) or ''​-2''​ (shell startup time)|+|''​%(FORMAT)T''​|output the date-time string resulting from using ''​FORMAT''​ as a format string for ''​strftime(3)''​. The associated argument is the number of seconds since Epoch, or ''​-1''​ (current time) or ''​-2''​ (shell startup time). If no corresponding argument is supplies, the current time is used as default|
 |''​%%''​|No conversion is done. Produces a ''​%''​ (percent sign)| |''​%%''​|No conversion is done. Produces a ''​%''​ (percent sign)|
  
Line 277: Line 277:
 Please read the manpage of ''​strftime(3)''​ to get more information about the supported formats. Please read the manpage of ''​strftime(3)''​ to get more information about the supported formats.
  
-==== Using printf inside of awk ====+===== differences from awk printf =====
  
-Here'​s ​the gotcha:+Awk also derives its //​printf()//​ function from C, and therefore has similar format specifiers. ​ However, in all versions of awk the space character is used as a string concatenation operator, so it cannot be used as an argument separator. ​ **Arguments to awk printf must be separated by commas.** ​ Some versions of awk do not require printf arguments to be surrounded by parentheses,​ but you should use them anyway to provide portability. 
 + 
 +In the following example, the two strings are concatenated by the intervening space so that no argument remains to fill the format.
  
 <​code>​ <​code>​
- 
-$ printf "​%s\n"​ "​Foo"​ 
-Foo 
  
 $ echo "​Foo"​ | awk '{ printf "​%s\n"​ $1 }' $ echo "​Foo"​ | awk '{ printf "​%s\n"​ $1 }'
Line 294: Line 293:
 </​code>​ </​code>​
  
-One fix is to use commas to separate ​the format from the arguments:+Simply replacing ​the space with a comma and adding parentheses yields correct awk syntax.
  
 <​code>​ <​code>​
-$ echo "​Foo"​ | awk '{ printf "​%s\n",​ $1 }'+$ echo "​Foo"​ | awk '{ printf"​%s\n",​ $1 }'
 Foo Foo
 </​code>​ </​code>​
  
-Or, use **printf** ​the way that awk wants you to:+With appropriate metacharacter escaping ​the bash printf can be called from inside ​awk (as from perl and other languages that support shell callout) as long as you don't care about program efficiency or readability.
  
 <​code>​ <​code>​
-echo "​Foo"​ | awk '{ printf $1 "\n" }'+echo "​Foo"​ | awk '​{ ​system( "printf ​\"​%s\\n \" \"" ​$1 "​\"​" ​ ) }'
 Foo Foo
 </​code>​ </​code>​
- 
-But then you lose the ability to pad numbers, set field widths, etc. that **printf** has. 
  
 ===== Differences from C, and portability considerations ===== ===== Differences from C, and portability considerations =====
Line 352: Line 349:
  
   * The optional Bash loadable ''​print''​ may be useful for ksh compatibility and to overcome some of [[commands/​builtin/​echo | echo]]'​s portability pitfalls. Bash, ksh93, and zsh's ''​print''​ have an ''​-f''​ option which takes a ''​printf''​ format string and applies it to the remaining arguments. Bash lists the synopsis as: ''​print:​ print [-Rnprs] [-u unit] [-f format] [arguments]''​. However, only ''​-Rrnfu''​ are actually functional. Internally, ''​-p''​ is a noop (it doesn'​t tie in with Bash coprocs at all), and ''​-s''​ only sets a flag but has no effect. ''​-Cev''​ are unimplemented.   * The optional Bash loadable ''​print''​ may be useful for ksh compatibility and to overcome some of [[commands/​builtin/​echo | echo]]'​s portability pitfalls. Bash, ksh93, and zsh's ''​print''​ have an ''​-f''​ option which takes a ''​printf''​ format string and applies it to the remaining arguments. Bash lists the synopsis as: ''​print:​ print [-Rnprs] [-u unit] [-f format] [arguments]''​. However, only ''​-Rrnfu''​ are actually functional. Internally, ''​-p''​ is a noop (it doesn'​t tie in with Bash coprocs at all), and ''​-s''​ only sets a flag but has no effect. ''​-Cev''​ are unimplemented.
 +
 +  * Assigning to variables: The ''​printf -v''​ way is slightly different to the way using command-substitution. [[syntax:​expansion:​cmdsubst | Command substitution]] removes trailing newlines before substituting the text, ''​printf -v''​ preserves all output.
  
 ===== See also ===== ===== See also =====
  • commands/builtin/printf.1345005240.txt
  • Last modified: 2012/08/15 04:34
  • by ormaaj