【Shell-awk】
文章目录
- 1. AWK
- 1. 基础知识
- 2. awk常见的内建变量
- 3. awk标准选项
- 4. awk条件判断(&& || !)
- 5. awk循环
- 6. awk执行流程
- 7. 小案列
1. AWK
1. 基础知识
- print $0的含义是打印整行,输出到stdout。
- -F参数设置的是awk的初始化变量FS(我们在后面的章节将讲到这个变量)。FS变量控制着awk的字段分隔符,默认情况下是空白字符。
- 在BEGIN代码块中,完成awk部分参数的初始化操作。END代码块,它是在所有的输入都处理完后awk运行的代码。
- awk的变量在建立时的初始值都是空字符串,但是当需要数值时,它会被视为0。
- awk允许在数组名称之后,以方括号将任意数字或字符串表达式括起来作为索引。
- 数组也无需声明就能使用。数组的存储空间在引用新元素时会自动增长。
- delete array[index]会从数组中删除元素,而delete array会删除array数组中的所有元素。
- 在awk中只能使用print;不能使用echo。
- 在awk中使用的变量,不需要,使用
$var
引用变量。直接使用var
即可获取到值。 、 - awk核心代码块的执行次数和操作文件的行数一致; BEGIN和END只会执行一次
变量 | 描述 |
---|---|
FILENAME | 当前输入文件的名称 |
FNR | 当前输入文件的记录数 |
FS | 文件分隔符(默认为空格,支持正则表达式) |
NF | 当前记录的字段数 |
NR | 在工作中的记录数 |
OFS | 输出字段分割字符 |
ORS | 输出记录分割字符(默认为 “\n”) |
RS | 输入记录分割字符 |
ARGC | 传入的参数个数 eg: awk 'BEGIN{print "Args=", ARGC}' 1 2 343 4 |
ARGV | 传入的参数 eg: awk 'BEGIN{print "Argv1=", ARGV[1]}' 1 2 343 4 ;ARGV[0]为awk;从ARGV[1]开始,才是参数。 |
选项 | 描述 | 示例 |
---|---|---|
-v | 该选项将一个值赋予一个变量,它会在程序开始之前进行赋值 | awk -v name1=alex 'BEGIN{printf "name=%s\n", name1}' |
if (condition1 && condition2) {
statement...
} else if (condition1 || condition2) {
statement...
} else {
statement...
}
5. awk循环
- while循环
BEGIN {
print "while is begin...."
}{
item=1
while( item < 10 ) {
item+=item
}
}END {
print "while is end, item : " item
}
- do…while循环
{
count=1 do {
print "count: " count++
} while(count != 10)
}
- for循环
BEGIN{
print "This is begin..."
}{
for(i=1;
i<=10;
i++) {
print "item: " i
}
}END {
print "This is end..."
}
6. awk执行流程 Created with Rapha?l 2.2.0 awk-BEGIN代码块 读取文件一行数据 执行awk代码块 是否读取文件还有剩余行? awk-END代码块 yes no 7. 小案列
- 设置文件分隔符。
awk –F ":" '{print "USER: "$1 "\t SHELL: "$7}'/tmp/passwd.piece
- 设置的分隔符为正则表达式
awk -F "[\t ]+" '{print "DEVICE: "$1 "\t FSTYPE: "$3}' /etc/fstab
- 符合正则表达式时,执行脚本
awk'/nologin/ {++adder}' num1.txt
- 使用条件判断
awk '{if ($1>100){count++;
print $1} \
else{count--;
print $2}}' num2.txt
- 使用awk脚本来执行批量的awk指令,操作文件。
num1.awk
BEGIN{
FS=":"
print "This is begin!"
}{
if($1>100 && $1<200) {
print $1 " is more than 100"
} else if($1>200) {
print $1" is more than 200"
} else {
less_than_100++
print $1 " is less than 100"
}
}END{
print "Less than 100, count: " less_than_100
}awk -f num1.awk num1.txt
推荐阅读
- Linux|Shell 编程~人入门到入坑。
- Linux技术|Windows平台下ADB的安装与使用
- c#|C#中使用SHFileOperation调用Windows的复制文件对话框
- Shell|Linux下 svn命令操作
- ubuntu环境|ubuntu10.04 常用命令
- ubuntu环境|Linux SSH相关命令
- python|合并和排序 Linux 上的文件 | Linux 中国
- 脚本输入处理——选项处理
- Shell|Shell脚本学习总结
- Shell|Linux: grep命令多关键字的“与”和“或”