awk基礎知識のまとめ(1)


1、    
awk             ,            ,              。
awk 
       。               , C   、python   bash。
    awk
     ,     awk,        。           :
$ awk '{ print }' 
/etc/passwd
      /etc/passwd           。  ,   awk      。   awk  ,     
/etc/passwd       。   awk  ,     /etc/passwd         print   。         
stdout,          catting /etc/passwd    。
  ,   { print }    。  awk  ,               ,       C   。          print   。  
awk  ,      print   ,             。
      awk   ,         :
$ awk '{ print $0 }' /etc/passwd
  awk  ,$0          ,   print   print $0        。
     awk   ,                。
  1:
$ awk '{ print "" }' 
/etc/passwd
    ""        print 
  ,        。     ,      /etc/passwd       ,awk 
        。    ,awk                 。
  2:
$ awk '{ print "hiya" }' /etc/passwd
               hiya。
2、      
awk                  ,      awk 
          。
              :
$ awk -F":" '{ print $1 }' 
/etc/passwd
   ,  awk ,   -F       ":"        。awk    print $1 
   ,                       。
       :
$ awk -F":" '{ print $1 $3 }' 
/etc/passwd
           :
halt7
operator11
root0
shutdown6
sync5
bin1
....etc.
    ,awk     /etc/passwd 
           ,                 。  ,      ,     --             !        bash   
python     ,       print $1 $3              。  ,        awk         ,awk 
                。                :
$ awk -F":" '{ print $1 " " $3 }' 
/etc/passwd
        print  ,     $1、" "   $3,       。
           :
$ awk -F":" '{ 
print "username: " $1 "ttuid:" $3" }' /etc/passwd
        :
username: halt          uid:7
username: operator      
uid:11
username: root          uid:0
username: shutdown      
uid:6
username: sync          uid:5
username: bin           
uid:1
....etc.
3、      
              awk             。
       ,             ,   awk  -f  ,              :
$ 
awk -f myscript.awk myfile.in
                awk  。  :
BEGIN {
      FS=":"
}
{ print $1 
}
    /etc/passwd           
      ,             (     FS   )。
             ,             。
4、begin end 
BEGIN   END  
  ,       ,awk              。  ,      awk 
                     。      ,awk         BEGIN  。             BEGIN  。   awk 
               BEGIN  ,        FS(     )  、                             。
awk           ,   END  。awk                     。  ,END 
                           。
5、     
awk 
         ,                        。
        foo  :
/foo/ { print }
    ,          :
/[0-9]+.[0-9]*/ { print }
                     ,           。                ,awk 
      。                    fred            。               fred,awk 
                print   :
$1 == "fred" { print $3 }
awk              ,   "=="、"<"、">"、"<="、">="   "!="。  ,awk      
"~"   "!~" 
   ,      “  ” “   ”。
                ,          。                  
root,                 :
$5 ~ /root/ { print $3 }
6、    
awk             C     if   。if     :
{ 
    if ( $5 ~ /root/ ) { 
       print $3 
    }
}
            ,   if 
        print   。
     awk if     。
{
    if ( $1 == "foo" ) 
{
       if ( $2 == "foo" ) {
            print "uno"
        } else 
{
          print "one"
        }
          } else if ($1 == "bar" ) 
{
                    print "two"
                 } else 
{
                    print "three"
                 }
}
   if         :
! /matchme/ { print $1 $3 $4 }
   :
{
     if ( 
$0 !~ /matchme/ ) {
         print $1 $3 $4
     }
}
             
matchme         。
awk            "||"(   )  "&&"(   ),             :
( $1 == "foo" ) 
&& ( $2 == "bar" ) { print } 
               foo          bar   。
7、  
awk   ,          。
    
  ,         、        。  ,awk            。       ,                     。
BEGIN   
{ x=0 }
/^$/    { x=x+1 }
END     { print "I found " x " blank lines. :}" 
}
  BEGIN   ,      x      。  ,awk         ,awk     x=x+1   ,   
x。
        ,   END  ,awk         ,           。
      
awk        “       ”。    awk   “    ”      awk 
                。  ,awk    “   ”,            ,              ,awk 
                。       ,       :
x="1.01"
# We just set x to contain the 
*string* "1.01"
x=x+1
# We just added one to a *string* 
print x
# 
Incidentally, these are comments :)
awk    :
2.01
        1.01       x,        。   bash   python        。
  ,bash 
       。  ,   bash  “    ”  ,    “  ”;         ,bash              $( ) ) 
   。
     python,      1.01              ,        。       ,         。
     
awk,      ,              。                     ,        :
{ print ($1^2)+1 
}
        ,                    ,awk                       。
8、   
awk            。      、 、 、 ,awk                  
"^"、 (  )    "%"        C                 。
           (i++、--foo)、 / / /      ( a+=3、b*=2、c/=2.2、d-=6.2)。     -- 
          /       (a^=2、b%=4)。
     
awk            。         awk 
     ,                      。                 ,FS。       ,           awk 
             。     /etc/passwd      ,  FS     ":"。        ,            FS。
FS             ;               ,          。             tab 
     ,             FS:
FS="t+"
     ,       "+"        ,   “         ”。
         (         tab),       FS           :
FS="[[:space:]+]"
           ,     。   ?       ,FS          ,awk        “         
tab”。        ,   FS           !
             。          "foo"   ,        ,                    :
FS="foo[0-9][0-9][0-9]"
    
                      ,                  。     NF   ,   “    ”  。awk 
                    。     NF            :
NF == 3 { print "this particular 
record has three fields: " $0 }
  ,            NF   ,  :
{   
    if ( 
NF > 2 ) {
       print $1 " " $2 ":" $3 
    }
}
9、    
   
    (NR)          。            (awk 
            1)。    ,                     。      ,NR 
         。  ,                     ,         ,     !      NF        NR 
         :
(NR < 10 ) || (NR > 100) { print "We are on record number 
1-9 or 101+" }
     :
{
   #skip header
   if (NR>10) {
       print "ok, now for the real information!"
   }
}
awk               。                。
    
awk                (     /etc/passwd   )     。/etc/passwd   UNIX 
     ,             ,         ,               ,      。         ,     awk 
           。      FS(     )      ":"。
      FS     ,     awk                  ,             。  ,            ,       
FS     。      ,        RS        。RS      awk           ,         。
  ,             “        ”             : 
Jimmy the Weasel
100 Pleasant 
Drive
San Francisco, CA 12345
Big Tony
200 Incognito Ave.
Suburbia, 
WA 67890
   ,     awk    3            ,          。   awk                 
($1),             ($2),  、               $3,             。    : 
BEGIN {
  FS="n"
  RS=""
}
        ,  FS     "n"    awk          。    RS     "",     awk 
             。   awk 
           ,               ,          。            ,          ,            ,         。
address.awk 
BEGIN {
   FS="n"
   RS=""
}
{
  print $1 ", " $2 ", " 
$3
}
       address.awk,          address.txt  ,       "awk -f address.awk 
address.txt"      。    : 
Jimmy the Weasel, 100 Pleasant Drive, San 
Francisco, CA 12345
Big Tony, 200 Incognito Ave., Suburbia, WA 67890
OFS   ORS
  address.awk   print    ,     awk 
   (  )           。                             (", ")。        ,     。         
", "    ,             awk    OFS,  awk      。
print "Hello", "there", 
"Jim!"
                      。   ,     awk "Hello"、"there"   "Jim!" 
      ,               OFS   。
     ,awk       : 
Hello there Jim!
            ,OFS      " ",    。  ,            OFS,   awk              。      
address.awk       ,    OFS          ", "    :
address.awk      
BEGIN {
     FS="n"
     RS=""
    OFS=", 
"
}
{
    print $1, $2, $3
}
 awk          
ORS,   “       ”。          ("n")   OFS,        print            。   ORS     awk 
           print   。           ,    ORS     "nn"。  ,             (    ),  ORS 
    " "。
        tab      
           ,               ,   tab 
     ,        。        address.awk   ,                     。   awk 
      ,      ,       :
Cousin Vinnie
Vinnie's Auto Shop
300 City 
Alley
Sosueme, OR 76543
       ,               ,         。  ,             。             :
              address.awk   
BEGIN { 
  FS="n" 
  RS="" 
  ORS=""
} 
 {  
 x=1 
 while ( x<NF ) { 
 print $x "t" 
 x++ 
  } 
print $NF "n" 
}
  ,       FS     "n",       RS     "",   awk                。  ,         ORS 
    "",    print               。                   ,         print "n"。
      ,        x                。  ,      1。  ,     while   (   awk     ,    
C      while   ),      (        )        tab   。  ,           ;  ,    ORS     
"",print       。      ,         (    ,   tab   ,         ):
Jimmy the 
Weasel        100 Pleasant Drive      San Francisco, CA 12345 
Big 
Tony        200 Incognito Ave.      Suburbia, WA 67890
Cousin Vinnie   
Vinnie's Auto Shop      300 City Alley  Sosueme, OR 76543