cut
在一行中取出部分数据,以行为单位
cut -d '分隔符 ' -f fields
$ pwd /home/users/chenzhaoqun
$ pwd | cut -d '/' -f 1
$ pwd | cut -d '/' -f 2
home
$ pwd | cut -d '/' -f 3
users
$ pwd | cut -d '/' -f 4
chenzhaoqun
$ pwd | cut -d '/' -f 3,4
users/chenzhaoqun
cut -c 字符范围
以字符为单位取出固定字符区间
$ export
declare -x ANT_HOME="/home/tools/tools/ant/apache-ant-1.6.5"
declare -x ANT_HOME_1_7="/home/tools/tools/ant/apache-ant-1.7.1" declare -x G_BROKEN_FILENAMES="1"
$ export | cut -c 12-
ANT_HOME="/home/tools/tools/ant/apache-ant-1.6.5" ANT_HOME_1_7="/home/tools/tools/ant/apache-ant-1.7.1" G_BROKEN_FILENAMES="1"
$ export | cut -c 12-15
ANT_
ANT_
G_BR
grep
分析一行,有我们需要的信息就将该行拿出来
grep [-acinv] [--color=auto] '查询字符串' filename
-a | 将二进制文件以text方式查询 |
---|---|
-c | 计算找到字符串的次数 |
-i | 忽略大小写 |
-n | 输出行号 |
-v | 反向选择,显示不包含‘查询字符串’的行 |
表2-1 grep使用的正则表达式元字符
元字符 | 功能 | 示例 | 匹配对象 |
---|---|---|---|
^ | 行首定位符 | ‘^love’ | 匹配所有以love开头的行 |
$ | 行尾定位符 | ‘love$’ | 匹配所有以love结尾的行 |
. | 匹配单个字符 | ‘l..e’ | 匹配包含一个l,后面跟两个字符,再跟一个e的行 |
* | 匹配0或者多个重复的位于*前的字符 | ‘*love’ | 匹配包含跟在0个或者多个字符后的love的行 |
[] | 匹配一组字符中的任意一个 | ‘[Ll]ove’ | 匹配Love或者love |
[^] | 匹配不在指定组内的字符 | ’[^A-Z]’ | 匹配不在范围A至Z之间的任意一个字符 |
< | 词首定位符 | ’<love’ | 匹配包含以love开头的词的行 |
< | 词尾定位符 | ‘love/>’ | 匹配包含以love结尾的词的行 |
(..) | 标记匹配到的字符 | ’(love)ing’ | 模式love被保存在1号寄存器中,之后可用\1引用它 |
x{m}或x{m,}或x{m,n} | 字符x的重复次数:m次、至少m次、至少m次但不超过n次 | ‘o{5}’,’o{5,}’ ,’o{5,10}’ | 匹配连续出现5个o、至少5个o或者5~10个o的行 |
其他方法:
1、使用多个 -e 参数
如:netstat -an | grep -E "ESTABLISHED|WAIT"
注意:netstat -an | grep -e EST -e WAIT 并列使用多个 -e参数可以实现或条件
2、使用扩展
如:netstat -an | grep -E "ESTABLISHED|WAIT"
注意:此处的 -E 是大写 ,匹配条件一定要加 引号
sort
sort [-fbMnrtuk] [file or stdin]
-f | 忽略大小写 |
---|---|
-b | 忽略行前的空格 |
-M | 以月份的名字来排序,JAN > DEC |
-n | 使用“纯数字”排序 |
-r | 反向排序 |
-u | uniq |
-t | 指定分隔符,默认是TAB |
-k | 以分割之后的哪个field来排序 |
uniq
uniq [-ic]
-i | 忽略大小写 |
---|---|
-c | 进行计数 |
$ last | cut -d ' ' -f1 | sort | uniq -c | sort -r -n
345 root
171 duanzhib
126 zouxidon
68 zhouqian
68 chenzhao
37 wangjinl
35 jiangwei
- last命令列出最近登录的用户列表
- 第一列为用户名
- 最后的结果是按登录次数逆序的排名
综合使用案例:
一个文件similog中有很多行:
debug:[一汽%20夏利n5,一汽%20夏利n5][1,2] simi 100, interval 16
想要把simi后面的分数取出来,并统计分布
cat similog | cut -d ']' -f 3 | cut -d ' ' -f 3 | tr -d ',' | sort -n | uniq -c
cat similog 不解释
cut -d ']' -f 3 取出 simi 100, interval 16
cut -d ' ' -f 3 取出100,
tr -d ',' 删除,
sort -n 排序
uniq -c 统计出现的次数
tee
tee [-a] file
- -a 对file进行续写,append文件模式
tee是将stdout转存一份到文件,又不影响stdout的输出,后面还可以被其他命令处理
字符转换命令 tr col join paste expand
tr [-ds] SET1 [SET2]
参数 | 解释 |
---|---|
-d | 删除str |
-s | 替换掉重复的字符 |
-t | 将SET1按SET2的长度截断 |
tr '[a-z]' '[A-Z]' | upper case |
col [-xb]
参数 | 解释 |
---|---|
-x | 将tab转成空格 |
-b | 将/,仅保留/最后接的字符 |
join [-ti12] file1 file2
将两个文件的按照第一列合并
参数 | 解释 |
---|---|
-t | 指定列分隔符,默认是空格 |
-i | 忽略大小写 |
-1 n | 对文件1按第n列比较 |
-2 n | 对文件2按第n列比较 |
join -1 3 file1 -2 4 file2
这是file1的第3列和file2的第4列,就会合并,然后放到第1列,后面接剩余的数据
注意:对比时两文件要sort
paste [-d] file1 file2
将两个文件的每行合并成一行,中间被分隔符分割
参数 | 解释 |
---|---|
-d | 指定分隔符 |
把file写成- 表示来自std input的意思
expand [-t] file
将tab转成空格,-t指定转成空格的个数
split
split [-bl] file PREFIX
将一个大文件切割成指定大小或指定行的小文件
参数 | 解释 |
---|---|
-b | 按大小分割,可加单位,b, k, m |
-l | 按行数分割 |
PREFIX | 分割后文件名的前缀 |
-a | suffix length,默认为2,且是aa,ab,ac…命名 |
-d | 以数字作为后缀 |
文件合并
使用重定向
如将file1,file2,file3合并成file
cat file1 file2 file3 >> file
cat file* >> file
xargs
xargs [-0epn] command
为command生成参数,并且执行command
因为有些command不支持直接使用管道,可以从stdin读入,使用空格分割,然后作为command的参数执行
参数 | 解释 |
---|---|
-0 | 还原stdin中的特殊字符,如 ` \ 空格等,为一般字符 |
-e | 后面接一个字符串,xargs分析到该字符串时就停止,该字符串不会被使用 |
-p | 每次执行command,都询问 |
-n | command使用n个参数,更多的都会忽略 |
- 减号
可以用-表示stdin或stdout,放在应该写file的地方