参考:https://www.cnblogs.com/rananie/p/15626439.html
printf '%05d\n' 3
参考:https://www.leaflag.cn/2019/03/17/%E8%BD%AC%E7%BD%AE%E6%96%87%E4%BB%B6/#%E5%89%8D%E7%BD%AE%E7%9F%A5%E8%AF%86
awk是啥?awk是一种优良的文本处理工具,它不仅是Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。先来了解一下解决这个问题需要用到的awk里的指令:
awk的shell格式是awk ‘{XXXX}’ filename,
所以我们可以使用这样的命令:
awk '{ |
这里为了好看一些,排了个版,当然我们需要在终端直接输入一整行指令,存成文件也可以,不过估计得改一下文件路径:
awk '{for(i=1;i<=NF;i++){if(NR==1){file[i]=$i}else{file[i]=file[i]" "$i}}}END{for(i=1;i<=NF;i++) print file[i]}' file.txt |
现在来解释一下。我们知道file.txt有三行,每行两个字段,所以NF=2;
如果文件只有一行,即NR=1的话,直接构造一个数组把字段存进去即可得到转置后的文件(注释里有,自己也可以试着打印一下)。得到NR=1是的file数组输出:
name |
接着开始读取下一行,又重新开始循环,i=1,此时NR=2,所以执行else里面的代码,此时会在原有file数组里增加file.txt第二行的字段(file[i]=file[i] “ “ $i),第一次循环:
name alice |
至此,第二次循环后执行END结束里的指令,得到我们想要的输出。
值得注意的是每次读完一行,都会这一行的开始读取字段,重新循环是一个点
问题:将mpstat中的pm转换为24小时进制
解决:
cat t |grep all|awk -F " *|:" '{if ($5~"PM")t=$2+12;else t=$2; print $1" "t":"$3":"$4","(100-$16)/100} '
t中的内容如下:
https://blog.csdn.net/xrt95050/article/details/6833286
awk 里的substr函数用法举例:
要截取要截取的内容1:
F115!16201!1174113017250745 10.86.96.41 211.140.16.1 200703180718
F125!16202!1174113327151715 10.86.96.42 211.140.16.2 200703180728
F235!16203!1174113737250745 10.86.96.43 211.140.16.3 200703180738
F245!16204!1174113847250745 10.86.96.44 211.140.16.4 200703180748
F355!16205!1174115827252725 10.86.96.45 211.140.16.5 200703180758
使用 awk 内置的取子串函数提取输入文件中的手机号
$ awk -F '[ !]' '{print substr($3,6,11)}' test.txt
13017250745
13327151715
13737250745
13847250745
15827252725
解释:
substr($4,20) ---> 表示是从第4个字段里的第20个字符开始,一直到设定的分隔符","结束.
substr($3,12,8) ---> 表示是从第3个字段里的第12个字符开始,截取8个字符结束.
substr($3,6) ---> 表示是从第3个字段里的第6个字符开始,一直到设定的分隔.
- #!/bin/bash
- #方法1
- res1=$(printf "%.2f" `echo "scale=2;1/3"|bc`)
- res2=$(printf "%.2f" `echo "scale=2;5/3"|bc`)
- #方法2 【popexizhi: 看来还是用awk 比bc 好一点 :)】
- #v=$(echo $big $small | awk '{ printf "%0.2f\n" ,$1/$2}')
- v1=$(echo 1 3 | awk '{ printf "%0.2f\n" ,$1/$2}')
- v2=$(echo 5 3 | awk '{ printf "%0.2f\n" ,$1/$2}')
- #方法3
- mem1=`echo "scale=2; a=1/3; if (length(a)==scale(a)) print 0;print a "|bc`
- mem2=`echo "scale=2; a=5/3; if (length(a)==scale(a)) print 0;print a "|bc`
- echo res1 is $res1
- echo res2 is $res2
- echo v1 is $v1
- echo v2 is $v2
- echo mem1 is $mem1
- echo mem2 is $mem2
N 读取下一行的内容并且将这些内容附加到 pattern space 当前的内容后面 (http://blog.khotyn.com/blog/2013/07/30/sed-part-two/)
1
2
3
4
| $ sed '1!G;h;$!d' t.txtthreetwoone |