[TOC]

awk 报告生成器

awk对每一行的内容进行处理,按照’条件{执行}条件{执行}’
默认以空格或\t为分隔符,$1代表分割后的第一段内容
cat a.txt|awk '$1==0 {print $1"\t"$2}'

NF 指字段总数,$0代表整行
NR 代表当前行数
FS 指分隔符,也可以用参数awk -F:设置分隔符为:
awk '{FS=":"}$3<10{print $3}' filename
这样用:来分隔,却只能从第二行开始,第一行还是用空格分隔的,所以要预先设定使用BEGIN关键词
awk 'BEGIN{FS=":"}$3<10{print $3}' filename
这儿的BEGIN关键词和END关键词分别对应第一个和最后一个{},这两个操作都不针对任何一行

在执行中可以使用变量,比如用来统计当前行的百分比或者累加
cat pay.txt | \ awk 'NR==1{printr "%10s %10s\n", $1, $2, "Total" } NR>=2{total=$1+$2;printf "%10d %10d %10d\n", $1, $2, total}'
这儿的total变量,使用时不需要使用$,另外两个表达式间用;或者按ENTER作为分隔

sed 流编辑器

一次处理一行数据,把当前行放到缓冲区,然后处理送往屏幕。本身是个管道命令。
sed [-nefr] [动作]
-i是直接修改读取文件内容,不是输出到屏幕
动作说明:[n1[,n2]]function
比如1,2d表示第一二行删除
a新增,c替换,d删除,i插入,p打印,s替换

cat a.txt | sed ‘2,3d’  
cat a.txt | sed ‘2a test’ #这个test变成了第三行  
cat a.txt | sed ‘2i test’ #这个test加到了第二行后面  
cat a.txt | sed ‘2c ……’ #这个是把第二行整行替换成……  
cat a.txt | sed ‘2,$s/a/b/g’ #这个是从第二行到最后一行中寻找所有的a替换成b  
cat a.txt | sed -n ‘2,3p’ #只显示2-3行的内容,-n是silent模式,p是打印

grep 文本过滤器

用于文本或者目录中以行为单位来数据选取。

grep -nr --color=auto -A2 -B2 'test' ~
在~目录中递归查找关键词为test的行的文件,并高亮显示,显示行号,显示前后两行,A after B before
-i 忽略大小写
-v 除了关键词的都选取

搜索内容默认支持基础正则表达式,通过-E支持扩展正则表达式

管道相关基础

标准输入stdin,代码为0,使用<,«
标准输出stdout,代码为1,使用>,»
标准错误输出stderr,代码为2,使用2>,2»

find ~ -name .bashrc > a 2> b
这儿>a相当于1>
如果要把正确错误的都输出到同一个文件
find ~ -name .bashrc >a 2>&1 find ~ -name .bashrc &>a
这儿2&>1,&>相当于等同于的意思

cat > catfile #创建文件,然后输入内容,按ctrl+d离开  
cat > catfile << “eof” #创建文件的时候,输入eof则输入结束  
cat > catfile < ~/.bashrc #创建文件,并且把bashrc的内容传递进来

ls dir/a && echo "exists" || echo "not exists"
每个命令执行后都会有个回传码,$?,为0时继续执行&&的内容,否则执行||后的内容,每个回传码只执行一次。

管道命令仅会执行标准输出,而不执行标准错误输出

sort

cat /etc/passwd |sort
默认是以第一个字母(相同时则按下一个)来排序的
可以按照指定的列排序
-k 按照某列来排序 -k 3
-t 分隔符,默认是tab,-t ‘:’
-r 反向排序

uniq

重复的行仅列出一个
uniq -c#添加统计次数

wc

分别列出行数,字数,字符数

tee

tee file用来双向重定向。
一般用>后屏幕输出就没了,所以用tee来进行双重重定向。

split

把一个大文件按照每1m大小切割
split -b 1m /bigfile splitfile #生成的文件是splitfileaa,splitfileab,splitfileac来命名。
按照每1000行来切割
split -l 1000 /bigfile splitfile

ll | split -l 10 – splitfile
这儿有个-号,这些命令需要输入文件却没有,在管道中,使用-来替代这个文件。

合并文件
cat splitfile* >> bigfile

xargs

很多命令不是管道命令,所以用xargs来提供该命令引用标准输入。
find /sbin -perm +7000 | xargs ls -l
这儿的ls不是管道命令,xargs可以读入stdin的数据,将其分析间隔成arguments。
比如find . -name “install.log” -print | cat
这儿只会讲找到的内容当做文本内容打印,输出./install.log
find . -name “install.log” -print | xargs cat
这样则会将其当做文件名来对待,打印出此文件的内容。

除了上面的split中出现的-,在stdin和stdout中都可以使用-来代替文件名
tar -cvf – /home | tar -xvf –