Linux文本处理相关指令

在linux下查看日志的时候,经常需要使用各种指令来进行筛选。

grep 可以理解为正则表达式

grep [参数] 文件名 
 -c 打印符合要求的行数 
 -v 打印不符合要求的行 
 -n 在输出符合要求的行的同时连同行号一起输出 
 -i 忽略大小写 
 [0-9]
 ^
 grep -c 'root' /etc/passwd
 grep -nv 'root' /etc/passwd
 grep '[0-9]' 文件名 
 grep '^#' -v test.py 

$ grep 'r..o' /etc/passwd
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
kernoops:x:116:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
 grep 'o{2}' /etc/passwd #匹配出现2次 o 的 

wc 文件内容的统计

-l 统计你有多少行 
-w 统计有多少个单词 

$ cat /etc/passwd | wc -l #统计有多少个用户 
46

cut命令:提取文件内容中指定的字段(列)、字符内容。单词的默认分隔符为空格。

-b:按照字节切,utf-8编码中每个汉字占3个字节 
-c:按照字符切 -d:指定分隔符
-f:指定以分隔符为分割的哪个字段
例:cut -d : -f 1,6 /etc/passwd 
显示文件中以:分割的第1和第6列的内容
cut -d : -f 1,3-5 /etc/passwd显示文件中以:分割的1,3,4,5列内容
cut -d : -f -3 /etc/passwd
显示文件中前三列内容
cut -d : -f 3- /etc/passwd
显示文件第三列到最后一列的内容
cut -c 1-3 /etc/passwd 取每行的前三个字符
echo ‘欢迎光临’ | cut -b 1-6 取前六个字节‘欢迎’

seq : 按顺序打印一些数字

基本用法: seq [选项] ...尾数
seq [选项] ...首数 尾数
seq [选项] ...首数 增量 尾数
例: seq 1 2 10 输出1~10之间的奇数
seq 2 2 10 输出1~10之间的偶数
seq 10 -2 1 输出10~1之间的偶数
用echo可以实现同样的效果
echo {首数...尾数....增量}
echo {1..10} 输出1~10整数
echo {1..10..2} 输出1~10的奇数
echo {2..10..2} 输出1~10之间的偶数
echo {10..1..-2} 输出10~1 之间的偶数

awk 流式编辑器 针对文档的行去操作 一行一行的去执行

$ head -n 2 /etc/passwd | awk -F ':' '{print $1 $7}'
root/bin/bash
daemon/usr/sbin/nologin

-F 指定分隔符 
$0 代表所有的列 
$1 代表 第一列

$ head -n 2 /etc/passwd | awk -F ':' '{print $1"~"$7}' 指定字符串连接符 一定要双引号 
root~/bin/bash
daemon~/usr/sbin/nologi

awk /root/ /etc/passwd #匹配root 
awk -F ':' '$1 ~/root/' /etc/passwd #匹配第一列式root 的 那一行 

awk -F ':' '$3==0' /etc/passwd #匹配第三列等于0的哪一行 

awk -F ':' '$7!="/usr/sbin/nologin"' /etc/passwd

awk -F ':' '$3 < $4' /etc/passwd

awk -F ':' '$3 > 100 || $7 == "/usr/sbin/nologin"' /etc/passwd 
awk -F ':' '$3 > 5 && $3 < 7' /etc/passwd
awk -F ":" '{(total=total+$3)};END{print total}' /etc/passwd #对所有行第三列求和 
head -n 3 /etc/passwd | awk -F ':' '$1 == "root"'

uniq unique 删除重复的行 跟sort 命令 组合使用

sort -n -t ":" -k 1 | uniq -c

-c 在每行前面加上出现的次数 
-d 只输出重复的行 多行只输出一行
-D 只输出重复的行 多行有几行输出几行 
-i 忽略大小写 

$ sort test.txt | uniq -c 
 1 apple
 2 banana
 1 caomei
 1 huaguang
 1 juhua
 1 orange
$ sort test.txt | uniq -d 
banana
$ sort test.txt | uniq -D
banana
banana

sort 排序 默认按照首字母排序

-n 按照数值排序 
-t 指定分割符 
-k 指定第几列 
-r 逆向排序


cat /etc/passwd | sort -n -t ":" -k 3 -r 按照 :分割符 指定第三列 纯数值排序 逆向排序 

`

面试题 : 查找你最常使用的10条命令

 history |awk '{print $2}'| sort |uniq -c|sort -n -k 1 -r|head -n 10

参考