head显示文件的前部
-n<行数> 显示的行数
head -n 5 log2014.log #显示文件前5行
-c<字节> 显示字节数
head -c 5 log2014.log #显示文件前5字符
tail 显示文件的后部
-n<行数> 显示行数
tail -n5 log2014.log #显示文件后5行
-f 循环读取
tail -f test.log #循环查看文件内容
tail -100f test.log
sort对文件中的行排序
-t :指定分隔符
-kn1:对n1字段排序
-kn1,n2 :由n1区间排序到n2区间,可以只写
-u:去重复
-n:使用纯数字排序
-r :反向排序
sort /etc/passwd
不加任何选项,则从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
sort -t: -k3 -n /etc/passwd
以“:”为分隔符,对第3个区域使用纯数字对文件排序
sort -t: -k3,5 -r /etc/passwd
以“:”为分隔符,从第3到第5区域间的字符串反向排序
cut 用来截取某一个字段
-d:后跟分隔符,分隔字符要用单引号括起来
-f :后面接的是第几个区块
-c :后面接的是第几个字符
cut -d ':' -f 1 /etc/passwd
使用冒号作为分割字符,截取第一段(-f和1之间的空格可有可无)
cut -d':' -f1,2,3 /etc/passwd
使用冒号作为分割字符,截取第一、二、三段
cut -d':' -f1-4 /etc/passwd
使用冒号作为分割字符,截取第一到第四段
cut -c1 /etc/passwd
截取第一字符
cut -c1-10 /etc/passwd
截取第一到第十字符
cut -c1,3,10 etc/passwd
截取第一,三,十字符
uniq
-c 去重复,标记重复次数
wc
-l 统计行数
-w 统计单词数
-c 统计字符数
tee 输出到屏幕并且重定向
tr 替换
splitgrep(egrep)sed awk
在正则表达式中, “^” 表示行的开始, “$” 表示行的结尾,空行则用 “^$” 表示。数字用[0-9]的形式,[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。[^字符] 表示除[ ]内的字符之外的字符。\<word\>表示完全匹配word,而不包括words等
#grep 搜索并把匹配的行打印(只能搜索,不能替换)
-c:只打印符合要求的行数
-w:精确匹配
-i:忽略大小写
-n :输出符合要求的行,连同行号一起输出
-v :打印不符合要求的行
-A :后跟数字,例如 –A2则表示打印符合要求的行以及下面两行(after)
-B :后跟数字,例如 –B2 则表示打印符合要求的行以及上面两行
-C :后跟数字,例如 –C2 则表示打印符合要求的行以及上下各两行
-r :遍历
练习:
grep 'root' -c passwd
打印passwd中还有root关键字的行数
grep -w car* nginx.log
答应有car*的行,而不是car开头的行
grep -i 'root' passwd
打印passwd中还有root(ROOT)关键字的行
grep -n 'root' passwd
打印passwd中还有root关键字的行连同行号一起输出
grep -v '/sbin/nologin' passwd
打印passwd中不包含/sbin/nologin有关键字的行
grep -A2 'halt' passwd
打印passwd中包含有halt关键字的行和下两行
grep -B3 'halt' passwd
打印passwd中包含有halt关键字的行和上三行
grep -C4 'halt' passwd
打印passwd中包含有halt关键字的行和上下各四行
grep -v '[0-9]' /etc/inittab
打印inittab中不包含数字的行
grep -v '^#' /etc/inittab
打印inittab中没有被注释(#开头,用^#表示)的行
grep -v 'n$' /etc/passwd
过滤以n结尾的行
grep -v '^$' /etc/inittab |grep -v '^#'
打印inittab中的空行(^$)和注释行
grep '^[A-Za-z]' /etc/inittab
打印inittab中以字母开头的行
grep '^[^A-Za-z]' /etc/inittab
打印inittab中不以字母开头的行
grep 'r..o' /etc/passwd
打印passwd中包含有r与o之间有两个任意字符的行
grep 'ooo*' /etc/passwd
打印passwd中包含有零个或多个ooo字符的行(*表示零个或多个前面的字符)
grep '.*' /etc/passwd
打印整个文件(‘.*’ 表示零个或多个任意字符,空行也包含在内)
grep 'o\{2\}' /etc/passwd
打印表示包含有'oo'的行({ }左右都需要加上脱意字符 ‘\’, 另外,使用{ }还可以表示一个范围的,‘{n1,n2}’ 其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次)
grep '(.*)' test.txt
(1234445)
(azc)
grep '(.*[0-9])' test.txt
(1234445)
查找文件内容
# grep -nir "root" ./*
# grep -nir "^root" ./*
# grep -nir "root$" ./*
#sed 处理文本的行并输出到屏幕上
1.打印某行(-n p)
sed -n '2'p /etc/passwd
打印passwd的第2行
sed -n '1p;4p;5p' /etc/passwd
打印第1,4,5行
sed -n '1,$'p /etc/passwd
打印passwd的所有行
sed -n '1,3'p /etc/passwd
打印passwd的1-3行
2.打印包含某个字符串的行
sed -n '/root/'p /etc/passwd
打印passwd中包含root关键字的行
sed -n '/^1/'p /etc/passwd
打印passwd中包以1开头的行
sed -n '/sh$/'p /etc/passwd
打印passwd中以sh结尾的行
sed -n '/r...o/'p /etc/passwd
打印passwd中r和o之间有三个字符的行
sed -n '/ooo*/'p /etc/passwd
打印passwd中有ooo字符的行
sed -nr '/root\|mysql/p'/etc/passwd
sed -n '/root/p;/bash/p' /etc/passwd
打印passwd中有root或者mysql字符的行
sed -n '/root/{/bash/p}' /etc/passwd
打印passwd中即有root又有bash字符的行
3.实现多个行为(-e)
sed -ne '2p' -e '/bash/p' /etc/passwd
打印第2行和包含有bash的行
4.删除行(d)
sed '1'd /etc/passwd
删除第1行
sed '1,3'd /etc/passwd
删除1-3行
sed '/root/'d /etc/passwd
删除包含有root关键字的行
5.替换(s,g 不加g只替换行中第一个,其中的//分隔符可以用#、@代替)
sed '1,3s/root/ROOT/g' /etc/passwd
替换1-3行中所有的root为ROOT
sed 's/[0-9]//g' /etc/passwd
替换所有的数字为空,删除所有数字
sed 's/[a-zA-Z]/*/g' /etc/passwd
替换所有的字母为*
sed 's#sbin/nologin#bin/login#g' /etc/passwd
替换/sbin/nologin为/bin/login
sed 's/[^|]\+/YY/5' /etc/passwd
替换第5个|后边的内容为YY
sed 's/^[ \t]*//g'/etc/passwd
删除行首的tab空格(^[ \t],是以空格或者tab键开头)
sed 's/[ \t]*$//g'/etc/passwd
删除行尾tab空格
# sed 's/bash$/BASH/g' /etc/passwd
# sed 's/^bash/BASH/g' /etc/passwd
sed -nr '/.*/p' /etc/passwd
匹配全部内容
sed中,使用\u表示大写,\l表示小写
1. 把每个单词的第一个小写字母变大写:
sed 's/\b[a-z]/\u&/g' filename
2. 把所有小写变大写:
sed 's/[a-z]/\u&/g' filename
3. 大写变小写:
sed 's/[A-Z]/\l&/g' filename
6.调换字符串位置
7.直接修改文件的内容
sed -i '1,3s/root/ROOT/g' /etc/passwd
替换1-3行中所有的root为ROOT并且写入文件
sed -i '4a 1111111111' /etc/passwd
在第四行后面添加行,内容为“1111111111111111111111”
#awk 文本分析处理#
1.截取文档中的某个段(-F指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。 Print用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,$0,表示整行。)
awk -F ':' '{print $1}' /etc/passwd
以:为分隔符,截取passwd的第一段
awk -F':' '{print $1"#"$2"*"$3"#"$4}' /etc/passwd
以:为分隔符,打印第2,3,4行,并用#隔开(自定义打印的#要用“”括起来)
awk '{for(i=N;i<=NF;i++)printf $i " ";printf"\n"}' filename
打印第N列之后所有的列
awk -F: 'OFS=":"{$NF=null;print}' /etc/passwd
OFS指定输出分隔符,删除最后一列
# awk -F: 'OFS=":"{$1="ROOT";print $0}' /etc/passwd
OFS指定输出分隔符,替换第一列为ROOT
2.匹配字符或字符串
awk '/oo/' /etc/passwd
匹配字符oo
awk -F ':' '$1 ~/root/' /etc/passwd
匹配passwd中以:分割的第一段中含有root字符的行(这里的~就是匹配的意思)
awk -F ':' '$1 ~/root/ {print $1,$3} /mysql/ {print $0}' /etc/passwd
匹配passwd中以:分割,第一个字符包含root字符的行打印第1,3字符,包含mysql字符打印整行(awk多次匹配,匹配完root,再匹配test)
3.条件操作符
awk -F ':' '$3=="0"' /etc/passwd
匹配passwd中第3个字符为0的行(awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,即使$3为数字,awk也不会把它当数字看待,所以不能去拿$3当数字去和数字做比较)
awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
匹配passwd中以:分割第7个字符不为/sbin/nologin的行
awk -F ':' '$3<$4' /etc/passwd
匹配passwd中第3段与第4段进行逻辑比较
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
匹配passwd中第3段小于7大于5的行
awk -F ':' '$3>"5" || $7=="/bin/bash"' /etc/passwd
匹配passwd中第3段大于5或者第7段为/bin/bash的行
4.awk的内置变量(NF,$NF,NR)
awk -F':' '{print NF}' /etc/passwd
打印passwd被:分割后共有多少段
awk -F':' '{print $NF}' /etc/passwd
打印passwd被:分割后的最后一段的值
awk -F':' '{print $(NF-3)}' /etc/passwd
打印passwd被:分割后的倒数第三段
awk 'NR>20' /etc/passwd
匹配passwd中行号大于20的行
awk -F ':' 'NR>20 && $1 ~ /ssh/' /etc/passwd
匹配passwd中行号大于20并且以:分割第一个字符为ssh的行
ifconfig eth0 |awk -F '[ :]+' 'NR==2{print $4}'
打印第二行的第四段
5.awk中的数学运算
awk -F':' '$1="wang"' /etc/passwd
将passwd以:分割后修改第一个字符为wang
awk -F':' '{$8=$3+$4;print $0}' /etc/passwd
将passwd以:分割,计算第3和第4字符的和输出为第8字符,并且打印整行
练习:
awk -F: '{sum+=$3} END {print "SUM = ",sum}' /etc/passwd
将passwd以:分割,计算第3段和
awk -F ':' '{if ($1=="root") print $0}' /etc/passwd
将passwd以:分割,如果第1段为root,打印整行
awk -F' ' '$1 ~/^1/' access.log
将access.log以空格分割,打印第1段以1开头的行
awk '$2 ~/^[0-9]/ {print $0}' 123
第二段如果以数字开头,打印整行
网友评论