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/12/16 13:26]
thebonsai [Differences from C, and portability considerations] printf -v vs command substituton
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 =====
  • commands/builtin/printf.1355664412.txt
  • Last modified: 2012/12/16 13:26
  • by thebonsai