# 文本与文本查找
## 1.grep
常用参数:
-A n --after-context显示匹配字符后n行
-B n --before-context显示匹配字符前n行
-C n --context 显示匹配字符前后n行
-c --count 计算符合样式的行数
-i 忽略大小写
-v反转
-a处理二进制文件
-l 只列出文件内容符合指定的样式的文件名称
-f 从文件中读取关键词
-n 显示匹配内容的所在文件中行数
-R 递归查找文件夹
常用组合:grep -Rni “abc”
实例:
(1)查找指定进程
ps -ef | grep svn
(2)查找指定进程个数
ps -ef | grep svn -c
(3)从文件夹中递归查找以grep开头的行,并只列出文件
grep -lR '^grep' /tmp
(4)查找非x的行内容
grep ‘[^x]' test.txt
(6)显示包含ed或者at字符的内容行
grep -E 'ed|at' test.txt
##2.find
命令选项:
-name 按照文件名查找文件 “*123*” 通配符要加引号
-iname忽略大小写
-perm 按文件权限查找文件
-user 按文件属主查找文件
-group 按照文件所属的组来查找文件。
-type 查找某一类型的文件,诸如:
d - 目录 f - 普通文件
-size n :[c] 查找文件长度为n块文件,带有c时表文件字节大小 +代表大于 -代表小于
-mmin n 查找系统中最后N分钟被改变文件数据的文件 n:正数代表外,负数代表内
-mtime n 查找系统中最后n*24小时被改变文件数据的文件 n:天数
常组合用 最常用命令:find /home/test(路径) -type f -mtime +10 -exec rm -rf {} \;
举例:
(1)查找48小时内修改过的文件 find -mtime -2
(2)在当前目录查找 以.log结尾的文件。 ". "代表当前目录 find ./ -name '\*.log'
(3)查找/opt目录下 权限为 777的文件 find /opt -perm 777
(4)查找大于210M的文件 find ./ -size +210M
find -size 1000c 查找等于1000字符的文件
(5)在当前目录中查找更改时间在10日以前的文件并删除它们(无提醒) find . -type f -mtime +10 -exec rm -rf {} \;
(6)当前目录更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 按y键删除 文中查找所有文件名以.log结尾、件, 按n键不删除 find . -name '\*.log' -mtime +5 -ok rm {} \;
(7)用exec选项执行cp命令
find . -name '\*.log' -exec cp {} test3 \;
(8)查找当前目录中以一个小写字母开头,最后是4到9加上.log结束的文件
find . -name '[a-z]\*[4-9].log' -print find用的是:通配符\*
# 软件安装与更新
##1. rpm安装
rpm -ivh package.rpm 安装一个rpm包
rpm -Uvh package.rpm 更新一个rpm包但不改变其配置文件
rpm -qa | grep 显示系统中所有已经安装的rpm包
rpm -e package_name 删除一个rpm包
源代码编译安装
./configure
make
make install
##2. yum源安装
yum install package_name 下载并安装一个rpm包 常用
yum update package_name 更新一个rpm包
yum remove package_name 删除一个rpm包
yum list 列出当前系统中安装的所有包
yum search package_name 在rpm仓库中搜寻软件包
yum clean all 删除所有缓存的包和头文件
# 网络配置
## 1.网络配置命令
ifconfig查看和配置网络接口
ip查看和配置网络接口、路由
netstat查看进程监听端口状态
network与networkmanager网络管理脚本
##2.配置文件
ifcfg-eth0 eth0 网卡配置文件
networking主机名配置文件
resolv.conf域名配置文件
#防火墙
##1. Selinux
常用命令
getenforce 状态的查看
Setenforce 0|1 #0表示警告模式1表示强制模式
配置文件
/etc/selinux/config
## 2.iptables
# Tcpdump
-i 指定网卡
-c指定抓包数量
-n不把网络地址转化成名字
-nn不进行duankou名称的转化
-w直接将分组写进文件中,而不是不分析并打印出来
-e在输出行打印出数据链路的头部信息
-vv输出详细的报文信息
host主机
port端口
#服务与日志
服务状态的查看命令
sevice 用法:sevice 服务名称 start/stop/restart/status
systemctl 用法:systemctl start/stop/restart/status 服务名称
常用服务日志
/var/log 系统日志默认目录
message系统日志
dmesg内核启动日志
secure安全日志
#磁盘分区
## 1.链接文件
符号链接
硬链接
##2. Mount挂载命令
-t文件系统类型
-o挂载选项 (ro只读挂载,rw读写挂载,remount重挂载)
配置文件
/etc/fstab
## 3.常用命令
Fdisk分区工具(-l查看分区信息、fdisk /dev/sdx为某一个存储分区)
df查看分区使用的空间大小 df -h
du查看文件夹使用空间大小 du -sh
mkfs格式化命令(mkfs.ext4 mkfs.xfs)
#系统启动过程与故障修复
##1.系统启动过程描述
Bios初始化,开始post开机自检,检查硬件
加载MBR到内存,加载磁盘主引导记录到内存
GRUB阶段
加载内核
systemd阶段
service服务或systemctl服务
启动,等待用户登录
#逻辑卷与lvm
Lvm分为三层:PV物理卷,VG卷组,LV逻辑卷
## 常用命令:
Pvcreate 建立pv pvs查看pv
Vgcreate建立vg vgs查看vg
Lvcreate建立lv lvs查看lv
Lvextend扩展lv
# grep 搜索字符串匹配的行 搜索要匹配的字符串的行和文件
强大的文本搜索命令,grep(Global Regular Expression Print)全局正则表达式搜索
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板,如果模板包括空格,则必须被引用。
模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
### 命令格式:
grep [option] pattern file|dir grep -参数 [正则表达式] 文件或路径 “要搜索的字符串”
常用参数:
-A n --after-context显示匹配字符后n行
-B n --before-context显示匹配字符前n行
-C n --context 显示匹配字符前后n行
-c --count 计算符合样式的行数
-i 忽略大小写
-l 只列出文件内容符合指定的样式的文件名称
-f 从文件中读取关键词
-n 显示匹配内容的所在文件中行数
-R 递归查找文件夹
常用组合:grep -Rni “abc”
### grep的规则表达式:
^ #锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$ #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
. #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.* #一起用代表任意字符。相当于通配符的* 任意多个任意字符
[] #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
--- begin 使用场景较少 供参考 ---
\< #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} #重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。
x\{m,\} #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\} #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b #单词锁定符,如: '\bgrep\b'只匹配grep。
--- end 使用场景较少 供参考 ---
### grep 实例:
(1)查找指定进程
ps -ef | grep svn
(2)查找指定进程个数
ps -ef | grep svn -c
(3)从文件夹中递归查找以grep开头的行,并只列出文件
grep -lR '^grep' /tmp
(4)查找非x的行内容
grep ‘[^x]' test.txt
(6)显示包含ed或者at字符的内容行
grep -E 'ed|at' test.txt
# sed stream editor 用的正则表达式 对文件内容进行增删改查
sed [选项] [命令] 文件名
sed的常用选项:
-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
-f:后跟保存了sed指令的文件
-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-n: 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
sed中的编辑命令:
a:追加 向匹配行后面插入内容 都会用到一个编辑命令
c:更改 更改匹配行的内容
i:插入 向匹配行前插入内容
d:删除 删除匹配内容的行
s:替换 替换掉匹配的内容
p:打印 打印出匹配的内容,通常与-n选项合用
=:用来打印被匹配的行的行号
r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件
### sed 举例
1 sed -i "/The start script/iabc" 1.txt #增 在包含 The start script行之前进行添加行 abc
2 sed -i "/The start script/aabc" 1.txt #增 在包含 The start script行之后进行添加行 abc
3 sed -i ‘s/指定的字符/要插入的字符&/’1.txt #增 在指定的字符之前插入字符 默认只匹配第一个 如果要匹配所有的&/g
4 sed -i 's/指定的字符/&要插入的字符/’ 1.txt #增 在指定的字符之后插入字符
sed -i 's/cp \$HIVE_HOME/\\&/' /opt/cloudera/parcels/CDH/lib/hive/bin/hive-config.sh
5 sed -i ‘s/^.\*23/#&/g’ 1.txt #增 注释掉某一行
6 sed -i '/ac/d' 1.txt #删 删除包含ac的行
7 sed '4d' 1.txt #删 删除第四行
8 sed -i "s/ac/bd/g" 1.txt #改 老字符替换成新字符
9 sed -i '/ac/c hello ' start_es.sh sed "/11/c999" 1.txt #改 替换包含ac的一行的内容
10 sed '3ahello' 1.txt #向第三行后面添加hello,3表示行号
11 sed '3ihello' 1.txt #在第三行之前插入hello
12 sed -n '3p' 1.txt #打印文件中的第三行内容
13 sed -n '1,3p' 1.txt #打印1到3行
14 sed '/^$/d' 1.txt #删除空行
15 sed -i '/bbb/r 2.txt' 1.txt # 读取2.txt文件,将文件内容写入到1.txt中匹配bbb的行之后。
16 sed -i 'r 2.txt' 1.txt # 读取2.txt文件,将文件内容写入到1.txt每一行之后。
17 sed ‘/789/w a.txt’ 1.txt #如果1.txt包含789的行,将包含789的行覆盖写入到a.txt中,如果不包含,清空a.txt
18 sed ‘w a.txt' 1.txt #将文件1.txt的内容写入到a.txt
19 sed -i -e '1,3d' -e '/abc/cABC' 1.txt #-e的用法举例,先删除1到3行,然后将匹配abc的行替换为ABC。
20 sed -n -e '/a/p' -e '/a/=' 1.txt #先打印文件匹配行的内容,再打印文件匹配航的行号。
21 sed -n ‘/abc/=' 1.txt #打印匹配行的行号
# sort 排序 sort
默认按ASCII码值进行比较,最后将他们按升序输出
示例1
sort 1.txt # 排序
示例2
sort -u 1.txt # 排序并去重 常用
示例3
sort -r 1.txt # 降序进行排序
示例4 慎重
[rocrocket@rocrocket ~]$ sort -r number.txt > number.txt
[rocrocket@rocrocket ~]$ cat number.txt
[rocrocket@rocrocket ~]$
// 看,竟然将number清空了
这个时候 -o就出现了,
sort -r 1.txt -o 1.txt # -o(output) 输出到原文件
示例5
10比2小的情况。
要使用-n选项,来告诉sort,“要以数值来排序”! 常用
sort -n(number) number.txt
示例六
这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量, 第三列表示水果价格。那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实 现?幸好,sort提供了-t选项,后面可以设定间隔符。(是不是想起了cut的-d选项)
指定了间隔符之后,就可以用-k来指定列数了。
sort -n -k 2 -t : facebook.txt
# -t 分隔符为:,-k 以第二列进行排序,-n 按照数值进行排序
示例七
-f 会将小写字母都转换为大写字母来进行比较,亦即忽略大小写
-b 会忽略每一行前面的所有空白部分,从第一个可见字符开始比较
示例八
我想让facebook.txt按照公司人数排序 ,人数相同的按照员工平均工资升序排序
sort -n -t ' ' -k 2 -k 3 facebook.txt
看,我们加了一个-k2 -k3就解决了问题。sort支持这种设定,就是说设定域排序的优先级,先以第2个域进行排序,如果相同,再以第3个域进行排序。
(如果你愿意,可以一直这么写下去,设定很多个排序优先级)
# uniq 去重
用法:uniq [选项]... [文件]
从输入文件或者标准输入中筛选相邻的匹配行并写入到输出文件或标准输出。
参数:
-c, --count 在每行记录前显示该行内容的数量
-d, --repeated 仅显示重复的记录行,并且去重
-D, --all-repeated[=delimit-method] 仅显示重复的行,并不去重
-i, --ignore-case 忽略大小写 以最先的字符为准
-s, --skip-chars=N 比较时跳过前N个字符
-u, --unique 仅显示非重复的行
-w, --check-chars=N 只对比指定的N个字符,默认是从开始算起,如果和-s一起使用那么要排除-s指定的字符数
### 举例
uniq -c 1.txt # 1.显示行的数量
uniq -d 1.txt # 2.只显示重复的行,并去重
uniq -u 1.txt # 3.仅显示非重复的行
uniq -s 2 -w 2 1.txt # 4.-s和-w
-s 2:忽略前两个字符,即从第三列开始比较
-w 2:只比较两个字符,即只比较第三列开始的两个字符
### 《 sort+uniq 》
• uniq 去除重复的行,最终结果包含重复和非重复的行。
• uniq -u 只打印非重复的行。
• uniq -d 只打印重复的行。
#### 两个文件的交集 --- 重复的行 先排序再去重 p排序之前先去重
sort out1.txt out2.txt | uniq -d
\# -d 输出重复的行, 需要注意一个问题,那就是这两个文件,在各自的文件中不要出现重复的数据(要先对各个文件进行排序去重)
两个文件的并集 --- 去重之后的行,包括重复的已被去重的行和不重复的行
sort out1.txt out2.txt | uniq # uniq不加参数意思是去掉重复的数据
#### 两个文件的差集
out1.txt-out2.txt
sort out1.txt out2.txt out2.txt | uniq -u
讲解:sort out1.txt out2.txt out2.txt 会让out2.txt的所有内容都出现两次,所以uniq -u 之后不会出现 out2.txt 里面的内容;而out1.txt和out2.txt重复的内容会至少出现3次以上,也不会输出到结果中.
所以最终结果一定是out1.txt在out2.txt中没有出现过的数据,也就是out1.txt-out2.txt的差集
### 《 sort+uniq 》
out2.txt - out1.txt
sort out1.txt out1.txt out2.txt | uniq -u
原理请看上面的out1.txt-out2.txt的讲解,原理是一样的
#### [提醒]
去除文件重复的行
在shell中可以利用uniq
sort unsorted.txt | uniq
注意:要先进行排序,才能调用uniq (uniq命令,只是把相邻的重复的数据行去掉)
#### paste 粘贴
paste [ -d -s ] -file1 file2
选项含义如下:
-d 指定不同于空格或tab键的域分隔符。例如用@分隔域,使用-d @。
-s 将每个文件合并成行
# awk 具有强大的文本格式化能力 一个强大的文本分析工具
awk [options] 'pattern{action}' file
command | awk ' condition { action }'
示例1 全部打印
awk '{print}' 1.txt
示例2 添加前缀和后缀
awk 'BEGIN{print "col1","col2"} {print} END{print "end1","end2"}' a.txt
示例3 -F 指定分隔符 常用
awk -F "+" '{print $2}' a.txt 必须单引号
示例4
NF(当前行的字段个数) $NF就代表最后一个字段,$(NF-1)代表倒数第二个字段
echo "aa bb cc dd" | awk '{print $NF}'
echo "aa bb cc dd" | awk '{print $(NF-1)}'
示例5 不打印某一列时,将对应列设置为空字符串即可,用 $NF="",设置多列时用分号分隔开
cat aa.txt | awk '{$NF="";print $0}’ #不打印最后一列
cat aa.txt | awk '{$(NF-1)="";$NF="";print $0}' #不打印最后两列
示例6 NR (当前处理的是第几行) row 行 Colum 列
cat test.txt | awk '{print NR")", $0}' #打印当前行号和当前文本内容 $0 打印所有
逗号表示输出的变量之间用空格分隔
右括号必需使用 双引号 才可以原样输出
示例7 打印指定行内容
java -version 2>&1 | awk 'NR==1 {print $0}' #打印第一行
cat a.txt | awk ‘NR==3 {print $0}'
示例8 awk 允许指定输出条件,只输出符合条件的行
awk '条件 {动作}' 文件名
特殊字符需要转义
cat exp.txt | awk '/stsvc\/fms/ {print $0}' #包含 stsvc/fms 的行
cat exp.txt | awk 'NR>4 {print $0}' #大于第四行
cat test.txt | awk '$2=="ff" {print $0}' #某个字段等于具体值
echo "aa ss dd" | awk '{ if($3 == "dd") print $0; else print "nothing"}' # if条件