awk内置变量比较多,长时间不用,容易忘记和混淆,特做个小结备忘
ARGV 命令行参数的排列
ARGC 命令行参数个数
RNVIRON 系统环境变量
FILENAME awk读入的文件名
FNR awk读入的文件的记录数
FS 指定域分割符,默认是空格,等价于 -F
NF 记录的域个数,简单说就是每读入一行的域的个数
NR 已经读入的记录数,简单的说,其值就是awk读到第几行值就是几
OFS 输出域分隔符
ORS 输出记录分隔符,默认的输出记录分隔符是 换行符\n
RS 控制输入记录分隔符,默认的输入记录分隔符是换行符\n
用的比较多的是后面六个 FS,NF,NR,OFS,ORS和RS
下面用个简单的例子来阐述
a.指定域分隔符FS为“:”,打印前三列的内容
b.指定域分隔符FS为“:”,并指定输出域分隔符OFS为”==“,打印前三列内容
c.指定域分隔符FS为“:”,并指定输出域分隔符OFS为”==“,同时指定输出记录域ORS为”*“,打印前三列内容
d.指定域分隔符FS为“:”,打印记录域个数NF和已经读入的记录域数NR
--END--
ARGV 命令行参数的排列
ARGC 命令行参数个数
RNVIRON 系统环境变量
FILENAME awk读入的文件名
FNR awk读入的文件的记录数
FS 指定域分割符,默认是空格,等价于 -F
NF 记录的域个数,简单说就是每读入一行的域的个数
NR 已经读入的记录数,简单的说,其值就是awk读到第几行值就是几
OFS 输出域分隔符
ORS 输出记录分隔符,默认的输出记录分隔符是 换行符\n
RS 控制输入记录分隔符,默认的输入记录分隔符是换行符\n
用的比较多的是后面六个 FS,NF,NR,OFS,ORS和RS
下面用个简单的例子来阐述
[root@localhost awk]# cat test
askwan11:askwan12:askwan13:askwan14
askwan21:askwan22:askwan23:askwan24
askwan31:askwan32:askwan33:askwan34
askwan41:askwan42:Askwan43:askwan44
askwan11:askwan12:askwan13:askwan14
askwan21:askwan22:askwan23:askwan24
askwan31:askwan32:askwan33:askwan34
askwan41:askwan42:Askwan43:askwan44
a.指定域分隔符FS为“:”,打印前三列的内容
[root@localhost awk]# awk 'BEGIN {FS=":"}{print $1,$2,$3}' test
askwan11 askwan12 askwan13
askwan21 askwan22 askwan23
askwan31 askwan32 askwan33
askwan41 askwan42 Askwan43
askwan11 askwan12 askwan13
askwan21 askwan22 askwan23
askwan31 askwan32 askwan33
askwan41 askwan42 Askwan43
b.指定域分隔符FS为“:”,并指定输出域分隔符OFS为”==“,打印前三列内容
[root@localhost awk]# awk 'BEGIN {FS=":";OFS="=="}{print $1,$2,$3}' test
askwan11==askwan12==askwan13
askwan21==askwan22==askwan23
askwan31==askwan32==askwan33
askwan41==askwan42==Askwan43
askwan11==askwan12==askwan13
askwan21==askwan22==askwan23
askwan31==askwan32==askwan33
askwan41==askwan42==Askwan43
c.指定域分隔符FS为“:”,并指定输出域分隔符OFS为”==“,同时指定输出记录域ORS为”*“,打印前三列内容
[root@localhost awk]# awk 'BEGIN {FS=":";OFS="==";ORS="*"}{print $1,$2,$3}' test
askwan11==askwan12==askwan13*askwan21==askwan22==askwan23*askwan31==askwan32==askwan33*askwan41==askwan42==Askwan43*
askwan11==askwan12==askwan13*askwan21==askwan22==askwan23*askwan31==askwan32==askwan33*askwan41==askwan42==Askwan43*
d.指定域分隔符FS为“:”,打印记录域个数NF和已经读入的记录域数NR
[root@localhost awk]# awk 'BEGIN {FS=":"}{print NF,NR}' test
4 1
4 2
4 3
4 4
4 1
4 2
4 3
4 4
--END--
常用shell脚本参数含义
[
2008/09/03 17:58 | by askwan ]
2008/09/03 17:58 | by askwan ]
为了写出友好和易于使用的脚本,这里总结了一下,目前大部分脚本程序最经常使用的参数
,和“国际”接轨,以后要慢慢培养自己这方面的能力
-a 显示所有对象
-c 设置一个具体数值
-d 指定一个目录
-D debug模式运行
-e 扩展一个对象
-f 指定一个从中读取数据的文件
-h 限制脚本帮助信息
-i 忽略大小写
-l 产生一个长格式化输出
-n 非交互式模式
-o 指定输出文件
-q 安静模式运行
-r 递归式处理文件和目录
-s 静默模式运行
-v 打印版本信息
-y 默认yes回答所有过程
能想到的就这些 欢迎补充
,和“国际”接轨,以后要慢慢培养自己这方面的能力
-a 显示所有对象
-c 设置一个具体数值
-d 指定一个目录
-D debug模式运行
-e 扩展一个对象
-f 指定一个从中读取数据的文件
-h 限制脚本帮助信息
-i 忽略大小写
-l 产生一个长格式化输出
-n 非交互式模式
-o 指定输出文件
-q 安静模式运行
-r 递归式处理文件和目录
-s 静默模式运行
-v 打印版本信息
-y 默认yes回答所有过程
能想到的就这些 欢迎补充
在bash中,$* 与 $@ 都表示shell所有的参数值,
实例一:
test1
[root@localhost askwan]# ./test1 askwan askwan1 askwan2 askwan3
再看示例2:
test2
[root@localhost askwan]# ./test2 askwan1 askwan2 askwan3 askwan4
从这点知道,其实$*和$@最大的区别就是,前者把脚本所有参数都当作一个整体的字符串,后者则以空格符区别对待各个参数。
实例一:
test1
[root@localhost askwan]# ./test1 askwan askwan1 askwan2 askwan3
when use the $* : askwan askwan1 askwan2 askwan3
when use the $@ : askwan askwan1 askwan2 askwan3
when use the $@ : askwan askwan1 askwan2 askwan3
再看示例2:
test2
[root@localhost askwan]# ./test2 askwan1 askwan2 askwan3 askwan4
$* parameter #1 = askwan askwan1 askwan2 askwan3
$@ parameter #1 = askwan
$@ parameter #2 = askwan1
$@ parameter #3 = askwan2
$@ parameter #4 = askwan3
$@ parameter #1 = askwan
$@ parameter #2 = askwan1
$@ parameter #3 = askwan2
$@ parameter #4 = askwan3
从这点知道,其实$*和$@最大的区别就是,前者把脚本所有参数都当作一个整体的字符串,后者则以空格符区别对待各个参数。
$# 与 ${!#}
[
2008/09/03 17:02 | by askwan ]
2008/09/03 17:02 | by askwan ]
$#和${!#}细微区别
示例:
[root@localhost askwan]# chmod a+x test
[root@localhost askwan]# ./test 1 2 3 4 5
[root@localhost askwan]# ./test
在有参数情况下,两者都表示最后一个参数的值;
在参数为零时,前者即$#显示零,而${!#}的值表示shell脚本名称。
示例:
[root@localhost askwan]# chmod a+x test
[root@localhost askwan]# ./test 1 2 3 4 5
the last parametes is 5 .
the last parametes is 5 .
the last parametes is 5 .
[root@localhost askwan]# ./test
the last parametes is 0 .
the last parametes is ./test .
the last parametes is ./test .
在有参数情况下,两者都表示最后一个参数的值;
在参数为零时,前者即$#显示零,而${!#}的值表示shell脚本名称。




