printf '输出类型输出格式' 输出内容
由此可以,printf是一个格式类型加计算过程的顺序
%ns (string)输出字符串,n是数字代表输出几个字符
%ni (int)输出整数。 n是数字代表输出几个数字
%n.mf (float)输出浮点数,n代表总位数,m代表小数位
\t 输出制表符,即tab键
printf 命令输出文件内容
这样看起来很乱只能通过制表符隔开,格式化输出printf可以识别制表符分隔符
printf不识别管道符之后会联系awk命令,此时想要去除第一行字符,先print,grep 写在管道符之后,如下图
局限性:只能提取行,不能提取列
-w 以单词为单位进行过滤
-A 过滤字符所在行以及其下几行(可以指定数字)
-B 过滤字符所在行以及其上几行
-C过滤字符所在行以及其上下几行
awk基本使用(行列都可以处理)
awk 选项(-F指定分隔符) 'BEGIN {操作} 匹配模式{动作1} 匹配模式{动作2}…… END {操作}' 文件名(匹配模式和动作用大括号区分,多个匹配模式中间用空格隔开)
printf(需要输入”\n“自动换行符)
print(不需要输入换行符可以自动换行)
awk可以提取空格和制表符为分隔符的内容
查看磁盘使用百分率,并将%去掉(以%为分隔符取第一列)
awk的选项-F 指定分隔符
若果想要打印2列用“,(默认以空格作为分隔符)”或者双引号指定分隔符
如果想要在分隔符中间再添加其他分隔符,双引号和单引号交替使用,可以再次调用变量为分隔符
一行一行处理,一个字段一个字段处理并输出:如果有BRGIN先执行BRGIN,之后讲第一行所有数据赋给$0,然后第一行第一列赋给$1第二列赋给$2······直到第一列全部赋值完成后,,如果需要输出,先把第一行满足条件的列输出。在将整个第二列赋值给$0,然后第二列的第一行赋值$1······最后执行END结束
如果有匹配模式,进行匹配,匹配成功执行操作,不成功,读取下一行
BRGIN :在awk程序一开始时,尚未读取的任何数据之前执行,只在程序开始时执行一次(用于手工指定分隔符)
在输出之前先输出个11111
END :在awk程序处理完所有数据,即将结束执行。END后的动作只在程序结束时执行一次
如果每一行列相同,可以交给‘END {print NF}’去处理,可以通过最后一行的列数统计处列数,但是如果不相同,则不能在END中统计
统计成绩大于等于86分的学生的名字(首先排除第一行,如果,第六行大于86,则输出第二行)
步骤:先判断有没有BEGIN,之后把第一行的数据附在aek中,把第一列,第二列......赋值在$1,$2......继续把第二行的数据赋值在AWK中......这样执行下去,哦按段也如此,先判断第一行的第6列是否大于86,在判断第二行的第六列是否大于86()
等于和不等于可以完全匹配字符,此时切记字符要加双引号
包含匹配字符串和完全匹配
A~B 判断字符串A中是否包含匹配B
判断第二列中名字包含Sc的学生的平均成绩(第六段)指定具体的某一列是因为防止一行中多个列都出现“Sc”字段
awk识别字符必须使用//包含字符串正则表达式
//支持正则可以使用通配符哦
如果一行没有重复的字段,无需怎加“$2~”包含符号
A!~B 判断字符串A中是否不包含匹配B
输出Lm的平均成绩(指定列更好)
awk在匹配模式和指定分的隔符都可以使用正则表达式
$0 代表awk所读入的整行数据(相当于不写)
$n 代表当前读入行第n列字段(第n列)
补充:cut默认只能以制表符作为空格,而awk默认可以以制表符和空格作为分隔符
NR 显示行号和NF当前拥有字段(列)数
由上图可知,虽然都正确输出,但是不够清晰,中间如果要加入制表符和相关解释说明的中文,要放入到双引号中
$NF代表打印的是最后一列
若每行列相同,统计列数可以交给END配合$NF处理
NR一般代用在匹配模式下,指定输出某行
指定打印第三行和第5行
FNR awk同时处理两个文件可以用到
由此可知,当NR>FNR时就可以判断,已经开始处理第二个文件
OFS指定输出的字段分隔符(默认为空格),输出时体现
ORS指定输出的记录分隔符,(即一个模块识别操作的分隔符,默认为换行符),输出时体现
写在BEGIN中指定分隔符()
FS 指定分隔符,默认是空格或者制表符(以废,同选项中的“F”)识别时起作用
如果不加BENGIN,会先把第一行读完,然后再指定分隔符已经晚了,第一行会被直接输出
看似cut更加简单,但是如果指定第三行uid必须为1000的用户,cut无法完成此条件截取,awk是这样截取的
RS指定读取记录分隔符,默认是换行符,识别时起作用
ENVIRON调用系统中的变量,不需要用$调用
ARGC命令参数的个数相当于shell中的 $
ARGV命令参数数组,相当于$@ $*
getline获取下一行(类似于sed中的N;)
获取行并模块化,getline之后$0变成了第二行,所以第一行的值必须用tmp保存
以N加分号配合换行符替代方式实现。为了方便记忆,在替换中所有-n和p一律省略
输出变量配合echo使用
求行字符长度为2的行,不要慌,放在条件中而已
split() 切割字符串化为数组形式处理
格式:split("字符串",数组名称,"分隔符") 按指定分隔符将字符串且各位数组
字符串替换(sub和gsub)
sub(gsub)(“需要被替换的字符”,“替换成的字符”,“要被替换的字段”)sub代表只替换一个字符,gsub代表本字段的所有字符都替换,指定输入哪个字段来表示,$0为整行全部替换
吧字符”0“替换成字符”?“,只替换第一行,然后输出整行
字符串格式化输出(输出格式和计算过程用逗号隔开)
print支持直接计算
例题1,截取stat中的权限
方法1(管道符分开截取)
方法2(正则匹配一步到位)
sed命令(选项都是英文,主要处理行)
sed(Stream Editor)流文件处理工具主要是用来将数据进行选取、替换、删除、新增,作用,替代vim的作用,不需要进行交互
格式:sed [选项] '地址 操作;地址 操作;······' 文件名(单引号中分号将多个部分隔开,地址和操作空格隔开)
sed命令将一行读取到模式空间(由上到下一行一行打印)
进行匹配,如果匹配成功,就执行操作,如果不匹配就丢弃,读取下一行
直到读取到文件最后一行
-n 只打印处理的行,多结合操作p一起(对比图:)
-i sed修改结果直接修改文件内容,而不是由屏幕输出
删除2-4行,并写入数据
将第三行和第四行删除并写入
可以直接在地址中加入分号进行多行操作
2p打印第二行 2,4p打印2到4行 2,$打印第二行到文件结尾(一般加-n)
使用正则/字符表达式/
此时和grep作用相似(包含匹配)
-r 让sed支持扩展正则
a 行追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾要用 “\”代表数据未完结
使用 “\”追加,怕自动换行导致单词失效 输出"\"回车自动换行输入
i 行插入,当前行前插入一行或多行。"\"作用同上
d 行删除,删除指定行
基本替换“c”(替换不需要-n和p了)
把第二行换成11111,第三行换成22222
sed局部替换(可用于截取字符串)
分隔符“/”或者“#”
第三段可以指定输出多段
卡之前和卡之后都要卡才能卡准
“/”作为分隔符的话需要用#,没有/做分隔符可以用“/”
例2:卡stat里面的权限
当然一口气划分好也可以
-n 读入下一行,上一行位于模式空间中的内容会被顶替掉(可以指定奇数行和偶数行)
N与上一行同时保持在模式空间(两行两行读取,和paste相似,每多写一个n就会多一行并入)配合替换使用
写两个N中间用;表示将后两行与第一行分成一个组