用镜头记录,用心灵体验 | 订阅本站 | 所有笔记 | 亲和力设计 | 流量

DB2 学习笔记

博客话题:DB2,Linux,Web,业余无线电,户外,摄影,截拳道,Thankpad,其他

Unix Shell

Shell 编程学习笔记(二)

目录

  1. 匹配多个tab
  2. 获取文件最后一行的最后一列,分隔最后一列的空格数量未知。
  3. Shell的Chr() 函数
  4. Shell的Asc()函数
  5. 将10进制数转换成16进制数
  6. awk 在正则表达式中引用一个变量

匹配多个tab

将一个或多个tab符号替换为一个空白。方法1:

$ sed 's/\t+/ /g' file

方法2:

$ awk '{gsub(/\t+/, " "); print}' test

获取文件最后一行的最后一列,分隔最后一列的空格数量未知。

文件如下,希望获得最后一个数字:3

cat test.dat
A.B.C.D.E.A.B.C.D.E
A.B.C.D.E.A.B.C.D.E
A.B.C.D.E.A.B.C.D.E
COUNT       3

方法1:

$ tail -1 test.dat | cut -d' ' -f2- | tr -d ' '

方法2:

$ awk 'NF>1 {a=$NF}END{print a}' test.dat

Shell的Chr() 函数

Chr(10进制数)

$ echo 65 | awk '{printf "%c\n", $0}'
A

Chr(16进制数)

echo '0x41' | awk '{printf "%c\n", strtonum($0)}'
A

Shell的Asc()函数

$ echo A | od -td1 | sed -r 's/[\t ]+/ /g' | awk 'NF>1{print $2}'
65
$ echo A | od -tx1 | sed -r 's/[\t ]+/ /g' | awk 'NF>1{print $2}'
41

将10进制数转换成16进制数

$ echo 10 |awk '{printf "%x", $0)}'
a

希望有前缀0x

$ echo 10 |awk '{printf "%#x", $0}'
0xa

希望不足2位前面补零

$ echo 10 |awk '{printf "%#.2x", $0}'
0x0a

awk 在正则表达式中引用一个变量

awk 中,通常我们使用2个slash "/.../" 将正则表达式wrap 起来,比如下面的awk 命令将文件中每一行开头的"str"替换为"newStr":

$ awk '{sub(/^str/, "newStr"); print}' file

但如果"str" 是一个awk变量或者是一个函数的返回值,那么需要进行如下修改才能工作:将"/.../"替换成双引号,并使变量在双引号之外。如下:

$ awk '{sub("^"$NF, "newStr"); print}' file

或者:

$ awk '{reg = "^"$NF; sub(reg, "newStr"); print}' file

以上$NF是awk的内部变量,代表当前行最后一列的值,可以替换成其它awk 变量或者有返回值的函数。如果需要,变量后面可以继续添加用双引号引起的正则表达式。

Alex's picture

my email address in picture

搜索|Search

按月归档|By Month

2009
07
2008
11
10
07
05
04
03
02
01
2007
12
10
07
06
05
04
03
02
01
2006
12
11
10
09
08
07
06
05
04
03
02
01
2005
11
10
09
08
07
04
03
2004
12
11
10
09
08
07
06
05
04
03
02
01
2003
12
10
09
08
06
2002
09
08
04
03
02
2001
12
09
07
06
05

我读|My Books

db2

我的链接|My Links

我的朋友|My Friends

Creative Commons License
This blog is licensed under a Creative Commons License.
Movable Type 4 Logo