服务器 频道

AWK :Linux 管理员的智能工具包(下)

  【IT168 服务器学院】添加文本

  可以按照添加控制序列或其他字符的相同方式将文本添加到显示中。例如,要将分隔符从空格改为冒号,则命令是

  awk ''{print $1":"$2":"$3":"$4":"$5}'' emp_names > new_emp_names

在这种情况下,字符 ( : ) 包含在引号 ( "/" ) 中,它被添加到每个字段之间。在引号之间的值可以是任何内容。例如,创建一个关于居住在阿拉巴马州的员工的外观类似数据库的显示:

  $ awk ''$5 ~ /AL/ {print "NAME: "$2", "$3"\nCITY-STATE:

  "$4", "$5"\n"}'' emp_names

  NAME: DULANEY, EVAN

  CITY-STATE: MOBILE , AL

  NAME: DURHAM , JEFF

  CITY-STATE: MOBILE , AL

  NAME: STEEN, BILL

  CITY-STATE: MOBILE , AL

  NAME: FELDMAN, EVAN

  CITY-STATE: MOBILE , AL

  NAME: SWIM, STEVE

  CITY-STATE: UNKNOWN, AL

  $

  数学操作

  AWK 除了提供文本功能,还提供全部范围的算术操作符,包括以下符号:

  + 将数字相加
  - 减
  * 乘
  / 除
  ^ 执行指数运算
  % 提供模
  ++ 将变量值加一
  += 将其他操作的结果分配给变量
  — 将变量减一
  -= 将减法操作的结果分配给变量
  *= 分配乘法操作的结果
  /= 分配除法操作的结果
  %= 分配求模操作的结果

  例如,假定您的机器上存在以下的文件,详细地列出硬件商店中的物品:

  $ cat inventory

  hammers 5 7.99

  drills 2 29.99

  punches 7 3.59

  drifts 2 4.09

  bits 55 1.19

  saws 123 14.99

  nails 800 .19

  screws 80 .29

  brads 100 .24

  $

  第一项业务定单是通过将第二个字段(数量)的值乘以第三个字段(价格)的值,计算每种物品的库存价值:

  $ awk ''{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3}'' inventory

  hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95

  drills QTY: 2 PRICE: 29.99 TOTAL: 59.98

  punches QTY: 7 PRICE: 3.59 TOTAL: 25.13

  drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18

  bits QTY: 55 PRICE: 1.19 TOTAL: 65.45

  saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77

  nails QTY: 800 PRICE: .19 TOTAL: 152

  screws QTY: 80 PRICE: .29 TOTAL: 23.2

  brads QTY: 100 PRICE: .24 TOTAL: 24

  $

  如果这些行本身并不重要,您只是希望确定商店中有多少件物品,则可以分配一个普通变量,按照每条记录中的物品数量增加:

  $ awk ''{x=x+$2} {print x}'' inventory

  5

  7

  14

  16

  71

  194

  994

  1074

  1174

  $

  根据这一数据,商店中有 1174 件物品。第一次执行时,变量 x 没有值,因此它采用第一行第二个字段的值。第二次执行时,它保留了第一行的值并加上第二行的值,以此类推,直到达到累计的总合。

  可以应用相同的过程来确定现有库存的总价值:

  $ awk ''{x=x+($2*$3)} {print x}'' inventory

  39.95

  99.93

  125.06

  133.24

  198.69

  2042.46

  2194.46

  2217.66

  2241.66

  $

  因此, 1174 件物品的价值是 $2,241.66 。虽然这一过程可以获得总计值,但它的外观很差,需要加工成实际的报表。利用一些附加项,很容易使显示变得更整洁:

  $ awk ''{x=x+($2*$3)}{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3,"BAL: "x}'' inventory

  hammers QTY: 5 PRICE: 7.99 TOTAL: 39.95 BAL: 39.95

  drills QTY: 2 PRICE: 29.99 TOTAL: 59.98 BAL: 99.93

  punches QTY: 7 PRICE: 3.59 TOTAL: 25.13 BAL: 125.06

  drifts QTY: 2 PRICE: 4.09 TOTAL: 8.18 BAL: 133.24

  bits QTY: 55 PRICE: 1.19 TOTAL: 65.45 BAL: 198.69

  saws QTY: 123 PRICE: 14.99 TOTAL: 1843.77 BAL: 2042.46

  nails QTY: 800 PRICE: .19 TOTAL: 152 BAL: 2194.46

  screws QTY: 80 PRICE: .29 TOTAL: 23.2 BAL: 2217.66

  brads QTY: 100 PRICE: .24 TOTAL: 24 BAL: 2241.66

  $

  该过程提供了每条记录的清单,同时将总价值分配给库存值,并保持商店资产的运作平衡。

0
相关文章