文本处理工具
抽取文本的工具
-
文件内容less和cat
-
文件截取: head 和tail
-
按列抽取: cut
-
按关键字抽取:grep
文件查看
- 文件查看命令:
cat,tac,rec cat [option]...[file]...
-E:显示行结束符$
-n:对显示出的每一行进行编号
-A:显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
分页查看文件内容
- more:分页查看文件
more [options...] file...
-d:显示翻页及退出提示 - less:一页一页地查看文件或STDIN输出
查看时有用的命令包括:
/文本搜索 文本
n/N 跳到下一个 或上一个匹配
less 命令是man命令使用的分页器
显示文本前或后行内容
head [option]...[file]...
-c#:指定获取前#字节
-n#:指定获取前#行
-#:指定行数tail [option]...[file]...
-c#:指定获取后#字节
-n#:指定获取后#行
-#:指定行数
-f:跟踪显示文件fd新追加的内容,常用日志监控
相当于 --follow=descriptor
-F:跟踪问价名,相当于–follow=name --retry- tailf 类型于 tail -f ,当文件不增长时不访问文件
按列抽取文本cut和合并文件paste
-
cut [optin] ...[file]...
-d delimiter:指明分隔符,默认tab
-f fileds:
#:第#个字段
#,#[,#]:离散的多个字符,例如1,3,6
#-#:连续的多个字段,例如1-6
混合使用:1-3,7
-c 按字符切割
–output-delimiter=string 指定输出分隔符eg: 1. cut -d : -f 1 /etc/passwd who | cut -c1-9 df | cut -c44-46 df | tr -s " " | cut -d " " -f5 | tr -d "%" df | tr -s " " "%" | cut -d % -f5 ifconfig etho | head -n2 | tail -n1 |tr -s " " : | cut -d: -f4 ifconfig ens33 | head -n2 | tail -n1 | tr -s " " | cut -d " " -f3
cut -d: F1,3 --output-delimiter="=====" /etc/passwd
安装httpd软件
关防火墙
centos6:service iptables stop
chkconfig iptables off
centso7:systemctl firewalld
systemctl disable firewalld
echo “<h1>welcome to linux </h1>”> /var/www/html/index.html
ll /var/log/httpd/access_log
tail -f /var/log/httpd/access_log
cut -d" " -f1 /var/log/httpd/access_log
cut和paste
- 显示文件或stdin数据的指定列
cut -d: -f1 /etc/passwd
cat /etc/passwd |cut -d: -f7
cut -c2-5 /usr/share/dict/words - paste合并成两个文件同行号的列到一行
paste [option]…[file]…
-d:分隔符:指定分隔符,默认tab
-s: 所有行合成一行显示
paste f1 f2
paste -s f1 f2
收集文件统计数据wc
- 计数单词总数、行总数、字节总数和字符总数
- 可以对文件或stdin中的数据运行
wc story.txt
39 237 1901 story.txt
行数 字数 字节数 - 常用选项
-l 只计数行数
-w 只计数单词总数
-c 只计数字节总数
-L 显示文件中最长的长度
文本排序sort
- 把整理过的文本显示在stdout,不改变原始文件
sort [options] file(s) - 常用选项
-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-f 选择忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c作为字段界定符
-k X 选项按照使用c字符分隔的x列来整理能够使用多次
eg: sort -t: -k3 -nr /etc/passwd df | tr -s ' ' % | cut -d% -f5 | sort -nr | head -n1 netstat -nt 网络连接数 cut -d" " -f1 /var/log/httpd/access_log | sort -u | wc -l
uniq
- uniq命令:从输入中删除前后相接的重复行
- uniq [option]…[file]…
-c:显示每次重复出现的次数
-d:仅显示重复过行
-u:仅显示不曾重复的行
注:连续且完全相同方为重复 - 常和sort命令一起配合使用:
sort userlist.txt | uniq -c
cut -d" " -f1 /var/log/httpd/access_log | sort | uniq -c | sort -nr | head -n10
统计远程主机登录前三的ip地址
比较文件 diff
- 比较两个文件之间的区别
diff foo.conf foo2.conf
复制对文件改变patch
- diff 命令的输出被保存在一种叫做“补丁“的文件中
使用 -u 选项来输出“统一的(unified)”diff格式文件,最适用补丁文件 - patch 复制在其他文件中进行的改变(要谨慎使用)
适用 -b 选项来备份改变了的文件
diff -u foo.conf foo2.conf >foo.patch
patch -b foo.conf foo.patch
diff -u fstab fstab2 >diff.log
rm -f fstab
patch -b fstab2 diff.log
Linux文本处理三剑客
- grep:文本过滤(模式:pattern)工具
grep,egrep,fgrep(不支持正则表达式搜索) - sed:steam editor,文本编辑工具
- awk:Linux上的实现gawk,文本报告生成器
grep
- grep:global search REgular expression andprint out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文本一行行进行匹配检查,打印匹配的行
模式:由正则表达式字符以及文本字符所编写的过滤条件 - grep [options] …pattern [file…]
grep root /etc/passwd
grep " U S E R " / e t c / p a s s w d g r e p ′ USER" /etc/passwd grep ' USER"/etc/passwdgrep′USER’ /etc/passwd
grep `whoami /etc/passwd - grep 命令选项
–color=auto 对匹配到的文本着色显示
-v: 显示不被pattern匹配的行
-i: 忽略字符大小写
-n: 显示匹配的行号
-c: 统计匹配的行数
-o: 仅显示匹配到的字符串
-q: 静默模式,不输出任何信息
-A#: after,后#行
-B#: before,前#行
-C#: context,前后各#行
-e:实现多个选项间的逻辑or关系
grep -e “cat” -e ‘dog’ file
-w: 匹配整个单词
-E:使用ERE
-F:相当于fgrep,不支持正则表达式
安装: nmap 扫描 namp -v -sP 172.20.108.0/24 | grep -Bl "Host is up" | grep report |cut -d " "-f5 cat p.txt >root >bash grep -f p.txt /etc/passwd
正则表达式
- regexp:有一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表达字符字面意义
而表示控制或通配的功能 - 程序支持:grep,sed,AWK,vim,less,Nginx,varnish等
- 分类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep -E , egrep - 正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl compatible regular expressions) - 元字符分类:字符匹配,匹配次数,位置锚定,分组
- man 7 regex
基本正则表达式元字符
. 匹配任意单个字符 [] 匹配指定范围内的任意单个字符 [^] 匹配指定范围外的单个字符 [:alnum:] 字符和数字 [:alpha:] 代表任何英文大小写字符 [:lower:] 小写字母 [:upper:] 大写字母 [:blank:] 空白字符 (空格和制表符) [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广) [:cntrl:] 不可打印的控制字符(退格、删除、警铃...) [:digit:] 十进制数字 [:xdigit:] 十六进制数字 [:graph:] 可打印的非空白字符 [:print:] 可打印字符 [:punct:]标点符号 \ 转义
5.匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
*匹配前面的字符任意次,包括0次 贪婪模式:尽可能长的匹配 .* 任意长度的任意字符 \? 匹配其前面的字符0或1次 \+ 匹配其前面的字符至少1次 \{n\} 匹配前面的字符n次 \{m,n\} 匹配前面的字符至少m次,至多n次 \{,n\} 匹配前面的字符至多n次 \{n,\} 匹配前面的字符至少n次 中括号里的. 就是.
ifconfig ens33 | grep "[0-9.]\{7,\}" | head -n1
位置锚定:定位出现的次数
^行首锚定,用户模式的最左侧
行
尾
锚
定
,
用
于
模
式
的
最
右
侧
P
A
T
T
E
R
N
行尾锚定,用于模式的最右侧 ^PATTERN
行尾锚定,用于模式的最右侧PATTERN 用于模式匹配的最右侧
^
空
行
[
[
:
s
p
a
c
e
:
]
]
∗
空行 ^[[:space:]]*
空行[[:space:]]∗ 空白行
<或\b 词首锚定,用于单词模式的左侧
>或\b 词尾锚定,用于单词模式的右侧
<pattern> 匹配整个单词
eg: grep -v "^#" /etc/fstab grep "^[[:space:]]*$: f1 过滤空行 grep "\
分组
- 分组:() 将一个或多个字符捆绑在一起,当作一个整体进行处理,如:
(root)+ - 分组括号中的模式匹配到的内容会被正则表达式引擎记录在内部的变量中,这些
变量的命名方式为\1,\2,\3 - \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
- (string1+(string2))
\1 : string1+(string2)
\2 : string2 - 后向引用:应用前面的分组括号中的模式所匹配字符,而非模式本身
- 或者:|
示例: a|b:a或b C|cat: C或cat (C|c)at: Cat或cat
echo wamgwamgwamgxxxmagmagwangwangwang | grep "\(wang\)\{3\}.*\(mag\)\+\1.*\2" echo rootxxrbbt | grep '\(r..t\).*\1' 不行 模式匹配的结果要一致 grep "^\(.*\):.*/\1$" /ect/passwd 前后内容一样 grep "^a\|^b.*" /etc/passwd grep "^(a\|b).*" /etc/passwd echo axy | grep "^(a\|b\)xy" 取版本号: grep -o "[0-9]\+." /etc/centos-release | grep -o "[0-9]\+" grep -o "[0-9]\+" /etc/centos-release | head -n1
egrep 扩展的正则表达式
- egrep =grep -E
- egrep [opions] pattern [file…]
- 扩张正则表达式的元字符:
- 字符匹配:
. 任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的单个字符 - 次数匹配:
*:匹配前面字符任意次 ?:0或一次 {m} : 匹配m次 {m,n} :至少m,至多n次 6)位置锚定: ^ : 行首 $ : 行尾 \< ,\b : 语首 \>,\b :语尾
- 分组:
()
后向引用:\1,\2,… - 或者
a|b: a或b
C|cat : C或cat
(C|c)at : Cat或cat