文件内容查看
|
cat
查看文本内容
|
cat
[OPTION]…
[FILE]…
-E:显示行结束符$
-A:显示所有控制符
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
|
[08:55:46 root@rocky data]#cat -E j.log
123$
$
111$
|
nl
显示行号,相当于cat -b
|
-b a 无论是否是空行都列出行号
-b t 空行不列出行号(默认)
-n ln 行号在显示栏的最左边显示且空行不列出行号
-n rn 行号在显示栏的最右边显示,且空行不列出行号,不填充0
-n rz 行号在显示栏的最右边显示,且加0
|
每一行编号
#nl -b a 1.txt
#cat -n 1.txt
非空行编号
#nl -b t 1.txt
#cat -b 1.txt
|
tac
逆向显示文本内容
|
-s:使用指定字符串代替换行作为分隔标志
tac 1.txt 2.txt > tac.txt 文件合并
|
[09:22:35 root@rocky data]#echo "1,2" | tac -s ,
2
1,
[09:26:44 root@rocky data]#seq 3
1
2
3
[09:26:47 root@rocky data]#seq 3 | tac
3
2
1
|
rev
将同一行的内容逆向显示
|
反转“hello world”
#echo "hello world" | rev
反转日志文件中的后三行文本
#tail -n3 log.txt | rev
|
[09:32:47 root@rocky data]#rev
abcde
edcba
[09:32:55 root@rocky data]#echo {1..10} | rev
01 9 8 7 6 5 4 3 2 1
|
hexdump
以 ASCII、十进制、十六进制或八进制显示文件内容
|
hexdump[options]FILE[...]
-b 单字节八进制显示。
-c 单字节字符显示。
-C 规范化“十六进制+ASCII”显示。
-d 两字节十进制显示。
-e <format_string> 以指定的格式字符串显示数据。
-f <format_file> 指定包含一个或多个换行分隔格式字符串的文件。内容使用#号开头表示注释。
-n 只解释输入的指定长度个字节。
-o 两字节八进制显示。
-s 跳过开头指定长度个字节。
-v 显示时不压缩相似的行。-v选项使hextump显示所有输入数据。没有-v选项,任何数量的输出行组,如果与前一组相同,将被替换为由一个星号构成的行。
-x 两字节十六进制显示。
|
查看头文件
hexdump -C -n 512 /dev/sda
|
more
可以实现分页查看文件,可以配合管道实现输出信息的分页
|
more [OPTIONS...] FILE...
-d: 显示翻页及退出提示
|
[10:14:14 root@rocky ~]#more /var/log/messages
|
less
实现分页查看文件或STDIN输出,less 命令是man命令使用的分页器
|
查看时有用的命令包括:
/文本 搜索 文本
n/N 跳到下一个 或 上一个匹配
|
#less 配合管道对其它命令的执行结果进行分页显示
[root@centos8 ~]#tree -d /etc |less
/etc
├── alternatives
|
head
可以显示文件或标准输入的前面行
|
head [OPTION]... [FILE]...
-c # 指定获取前#字节
-n # 指定获取前#行,#如果为负数,表示从文件头取到倒数第#前
-# 同上
|
[root@centos8 ~]#cat /dev/urandom | tr -dc '[:alnum:]'| head -c10 |
tee pass.txt | passwd --stdin mage
|
tail
查看文件或标准输入的倒数行
tail 和head 相反
|
tail [OPTION]... [FILE]...
-c # 指定获取后#字节
-n # 指定获取后#行,如果#是负数,表示从第#行开始到文件结束
-# 同上
-f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新
建同名文件,将无法继续跟踪文件
-F 跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文
件
tailf 类似 tail –f,当文件不增长时并不访问文件,节约资源,CentOS8已经无此工具
|
#只查看最新发生的日志
[root@centos8 ~]#tail -fn0 /var/log/messages
[root@centos8 ~]#tail -0f /var/log/messages
#取IP行
[root@centos8 data]#ifconfig | head -2 | tail -1
|
look
显示文件中以特定字符串开始的行
|
look [选项] string files
-d 只对比数字和英文字母,其他忽略
-f 忽略字符的大小写
-a 使用字典文件/usr/dict/web2
-t 指定字符串结束符
|
在look执行二进制搜索时,必须对文件中的行进行排序。如果未指定文件,则使用文件“/usr/share/dict/words“,只比较字母数字字符,忽略字母字符的大小写。
#look hello z.c
hello world,
|
文本处理工具
|
cut
提取文本文件或STDIN数据的指定列
|
cut [OPTION]... [FILE]...
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段,例如:3
#,#[,#]:离散的多个字段,例如:1,3,6
#-#:连续的多个字段, 例如:1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
|
#cut -d: -f1,3-4,7 /etc/passwd
#ifconfig |head -n2 |tail -n1|tr -s " " |cut -d " " -f3
#cut -d: -f1,3,7 --output-delimiter="---" /etc/passwd
#echo {1..10}| cut -d ' ' -f1-10 --output-delimiter="+" |bc
#df | tail -n +2|tr -s ' ' |cut -d' ' -f5 |tr -d %
|
paste
合并多个文件同行号的列到一行
|
paste [OPTION]... [FILE]...
-d #分隔符:指定分隔符,默认用TAB
-s #所有行合成一行显示
|
#paste -d":" alpha.log seq.log
#paste -s seq.log
#paste -s -d: f1.log f2.log
[root@centos8 ~]#seq 10 |paste -s -d+|bc
55
批量修改密码
[root@centos8 ~]#paste -d: user.txt pass.txt|chpasswd
|
文本分析工具
|
wc
统计文件的行总数、单词总数、字节总数和字符总数
可以对文件或STDIN中的数据统计
|
-l 只计数行数
-w 只计数单词总数
-c 只计数字节总数
-m 只计数字符总数
-L 显示文件中最长行的长度
|
#wc story.txt
39 237 1901 story.txt
行数 单词数 字节数
#df | tail -n $(echo `df | wc -l`-1|bc)
|
sort
文本排序
把整理过的文本显示在STDOUT,不改变原始文件
|
sort [options] file(s)
-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-h 人类可读排序,如: 2K 1G
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique),合并重复项,即去重
-t c 选项使用c做为字段界定符
-k # 选项按照使用c字符分隔的 # 列来整理能够使用多次
|
#统计日志访问量
#cut -d" " -f1 /var/log/nginx/access_log |sort -u|wc -l
#查看分区利用率最高值
#df | tr -s " " %|cut -d% -f5|tr -d '[:alpha:]' | sort -nr|head -n1
|
uniq
从输入中删除前后相接的重复的行
|
uniq [OPTION]... [FILE]...
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
uniq常和sort 命令一起配合使用:
sort userlist.txt | uniq -c
|
统计日志访问量最多的请求
#lastb -f btmp-34 | tr -s ' ' |cut -d ' ' -f3|sort |uniq -c |sort -nr | head -3
并发连接最多的远程主机IP
#ss -nt|tail -n+2 |tr -s ' ' : |cut -d: -f6|sort|uniq -c|sort -nr |head -n2
#取文件的共同行
#cat test1.txt test2.txt | sort |uniq -d
#取文件的不同行
#cat test1.txt test2.txt | sort |uniq -u
|
diff
比较两个文件之间的区别
|
-u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件
|
#diff -u f1.txt f2.txt
#diff -u f1.txt f2.txt > f.patch
|
path
复制在其它文件中进行的改变(要谨慎使用)
|
-b 选项来自动备份改变了的文件
|
diff -u foo.conf foo2.conf > foo.patch
patch -b foo.conf foo.patch
|
vimdiff
相当于 vim -d
|
#vimdiff f1.txt f2.txt
|
:qa
退出所有窗口
Vim中切换窗口(在文件之间切换)
切换窗口:Ctrl + w + (h/j/k/l) 。
即h左、j下、k上、l右,表示窗口切换的方向。
|
cmp
查看二进制文件的不同
|
#cmp /bin/dir /bin/ls
|
#cmp /bin/dir /bin/ls
#跳过前735个字节,观察后面30个字节
[root@centos8 ~]#hexdump -s 735 -Cn 30 /bin/ls
[root@centos8 ~]#hexdump -s 735 -Cn 30 /bin/dir
|
文件查找工具
|
locate
在文件系统上查找符合条件的文件
非实时查找(数据库查找)
|
locate [OPTION]... [PATTERN]...
-i 不区分大小写的搜索
-n N 只列举前N个匹配项目
-r 使用基本正则表达式
查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db
执行updatedb可以更新数据库
locate和updatedb命令来自于mlocate包
|
#搜索名称或路径中包含“conf"的文件
locate conf
#使用Regex来搜索以“.conf"结尾的文件
locate -r '\.conf$'
文件新创建和删除,无法马上更新locate数据库
|
find
在文件系统上查找符合条件的文件
实时查找
通过遍历指定路径完成文件查找
|
find [OPTION]... [查找路径] [查找条件] [处理动作]
指定搜索目录层级:
-maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
-mindepth level 最小搜索目录深度
对每个目录先处理目录内的文件,再处理目录本身:
-depth
-d
根据文件名和inode查找:
-name "文件名称" #支持使用glob,如:*, ?, [], [^],通配符要加双引号引起来
-iname "文件名称" #不区分字母大小写
-inum n #按inode号查找
-samefile name #相同inode号的文件
-links n #链接数为n的文件
-regex “PATTERN" #以PATTERN匹配整个文件路径,而非文件名称
根据属主、属组查找:
-user USERNAME #查找属主为指定用户(UID)的文件
-group GRPNAME #查找属组为指定组(GID)的文件
-uid UserID #查找属主为指定的UID号的文件
-gid GroupID #查找属组为指定的GID号的文件
-nouser #查找没有属主的文件
-nogroup #查找没有属组的文件
|
根据文件类型查找:
-type TYPE
TYPE可以是以下形式:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
空文件或目录:
-empty
组合条件:
与:-a ,默认多个条件是与关系,所以可以省略-a
或:-o
非:-not !
排除目录:
#查找/etc/下,除/etc/security目录的其它所有.conf后缀的文件
find /etc -path '/etc/security' -a -prune -o -name "*.conf"
根据文件大小来查找:
-size [+|-]#UNIT #常用单位:k, M, G,c(byte),注意大小写敏感
#UNIT: #表示(#-1, #],如:6k 表示(5k,6k]
-#UNIT #表示[0,#-1],如:-6k 表示[0,5k]
+#UNIT #表示(#,∞),如:+6k 表示(6k,∞)
|
find
|
根据时间戳:
#以“天"为单位
-atime [+|-]#
# #表示[#,#+1)
+# #表示[#+1,∞]
-# #表示[0,#)
-mtime
-ctime
#以“分钟"为单位
-amin
-mmin
-cmin
根据权限查找:
-perm [/|-]MODE
MODE #精确权限匹配
/MODE #任何一类(u,g,o)对象的权限中只要有一位匹配即可,或关系,+ 从CentOS 7开始淘汰
-MODE #每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
正则表达式:
-regextype type
-regex pattern
|
处理动作:
-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行"ls -dils"命令格式输出
-fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file
-delete:删除查找到的文件,慎用!
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会
交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
|
例子:
|
find /etc -maxdepth 2 -mindepth 2
#find -regex ".*\.txt$"
#查看/home的目录
find /home –type d -ls
#find /app -type d -empty
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
#找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp \( -not -user root -a -not -name 'f*' \) -ls
find /tmp -not \( -user root -o -name 'f*' \) –ls
#排除/proc和/sys目录
find / \( -path "/sys" -o -path "/proc" \) -a -prune -o -type f -a -mmin -1
|
find -perm 755 会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm /222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配
find /you/find/dir -regextype posix-extended -regex "regex"
#备份配置文件,添加.orig这个扩展名
find -name ".conf" -exec cp {} {}.orig \;
#提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
#在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
#查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644 -name "*.sh" –exec chmod 755 {} \;
|
xargs
参数替换
由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数
据,并且以空格符或回车符将 stdin 的数据分隔成为参数
另外,许多命令不能接受过多参数,命令执行可能会失败,xargs 可以解决
|
注意:文件名或者是其他意义的名词内含有空格符的情况
find | xargs COMMAND
#显示10个数字
[root@centos8 ~]#seq 10 | xargs
1 2 3 4 5 6 7 8 9 10
#删除当前目录下的大量文件
ls | xargs rm
find -name "*.sh" | xargs ls -Sl
[root@centos8 data]#echo {1..4} |xargs
1 2 3 4
[root@centos8 data]#echo {1..4} |xargs -n1
1
2
3
4
[root@centos8 data]#echo {1..4} |xargs -n2
1 2
3 4
#批量创建和删除用户
echo user{1..10} |xargs -n1 useradd
echo user{1..100} | xargs -n1 userdel -r
|
#这个命令是错误的
find /sbin/ -perm /700 | ls -l
#查找有特殊权限的文件,并排序
find /bin/ -perm /7000 | xargs ls -Sl
#此命令和上面有何区别?
find /bin/ -perm -7000 | xargs ls -Sl
#以字符nul分隔
find -type f -name "*.txt" -print0 | xargs -0 rm
#并发执行多个进程
seq 100 |xargs -i -P10 wget -P /data http://10.0.0.8/{}.html
#并行下载bilibili视频
yum install python3-pip -y
pip3 install you-get
seq 60 | xargs -i -P3 you-get https://www.bilibili.com/video/BV14K411W7UF?p={}
|
文本格式化命令
|
printf
格式化输出的命令
与 echo 类似
|
用法
printf FORMAT [ARGUMENT]...
printf OPTION
选项
-v VAR
将输出分配给 shell 变量 VAR 而不是在标准输出上显示。
--help
展示帮助文档并退出。
--version
展示版本信息并退出。
FORMAT 以 C语言的 printf 格式控制输出。格式字符如下:
\"
双引号。
\\
反斜杠。
\a
响铃。
\b
退格。
\c
取消后续输出。
\e
向右删除一个字符。
\f
换页。
\n
换行。
\r
回车。
\t
水平制表。
\v
垂直制表。
\NNN
八进制数 NNN 所代表的 ASCII 码字符。
\xHH
十六进制 HH 对应的8位字符。HH 可以是一到两位。
\uHHHH
十六进制 HHHH 对应的 Unicode 字符。HHHH 一到四位。
\UHHHHHHHH十六进制 HHHHHHHH 对应的 Unicode 字符。HHHHHHHH 一到八位。
%%
百分号。
%b
在相应的参数中展开反斜杠转义序列。
%q
以可重用为 shell 输入的方式引用参数。
%(fmt)T
输出使用 FMT 作为 strftime 的格式字符串产生的日期时间字符串。
|
[root@server ~]# printf "%5.5f\n" 370
370.00000
[root@server ~]# printf "%010.5f\n" 370
0370.00000
[root@server ~]# printf "%10.5f\n" 370
370.00000
[root@server ~]# printf "%+d\n" 370
+370
[root@server ~]# printf "%-d\n" 370
370
|
文本处理三剑客
|
grep
主要对文本的(正则表达式)行基于模式进行过滤
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
|
grep [OPTIONS] PATTERN [FILE...]
--color=auto 对匹配到的文本着色显示
-m # 匹配#次后停止
-v 显示不被pattern匹配到的行,即取反
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
-w 匹配整个单词
-E 使用ERE,相当于egrep
-F 不支持正则表达式,相当于fgrep
-P 支持Perl格式的正则表达式
-f file 根据模式文件处理
-r 递归目录,但不处理软链接
-R 递归目录,但处理软链接
|
取两个文件的相同行
#grep -f /data/f1.txt /data/f2.txt
#cat /data/f1.txt /data/f2.txt| sort | uniq -d
分区利用率最大的值
#df |grep '^/dev/sd' |grep -oE '\<[0-9]{,3}%'|grep -Eo '[0-9]+' |sort -nr|head -n1
哪个IP和当前主机连接数最多的前三位
#ss -nt | grep "^ESTAB" |tr -s ' ' : |cut -d: -f6|sort |uniq -c|sort -nr|head -n3
连接状态的统计
# ss -nta | tail -n +2 |cut -d" " -f1|sort |uniq -c
#egrep -v '^(#|$)' /etc/httpd/conf/httpd.conf
#ifconfig eth0 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -1
过滤掉文件的注释(包括#号的行)和空行
#grep -Ev '^$|#' /etc/fstab
算出所有人的年龄总和
#grep -Eo "[0-9]+" /data/age.txt | tr '\n' + | grep -Eo ".*[0-9]"|bc
#grep -oE '[0-9]+' /data/age.txt| paste -s -d+|bc
|
sed
stream editor,文本编辑工具
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。模式空间(PatternSpace)。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象.一行一行的处理,打开速度非常快,执行速度也很快
|
sed [option]... 'script;script;...' [inputfile...]
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
-s 将多个文件视为独立文件,而不是单个连续的长文件流
#说明:
-ir 不支持
-i -r 支持
-ri 支持
-ni 危险选项,会清空文件
script 格式:
'地址命令'
地址格式:
1. 不给地址:对全文进行处理
2. 单地址:
#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
3. 地址范围:
#,# #从#行到第#行,3,6 从第3行到第6行
#,+# #从#行到+#行,3,+4 表示从3行到第7行
/pat1/,/pat2/
#,/pat/
/pat/,#
4. 步进:~
1~2 奇数行
2~2 偶数行
|
命令:
p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
q 结束或退出sed
查找替换:
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I,i 忽略大小写
|
sed
|
高级命令
P 打印模式空间开端至\n内容,并追加到默认输出之前
h 把模式空间中的内容覆盖至保持空间中
H 把模式空间中的内容追加至保持空间中
g 从保持空间取出数据覆盖至模式空间
G 从保持空间取出内容追加至模式空间
x 把模式空间中的内容与保持空间中的内容进行互换
n 读取匹配到的行的下一行覆盖至模式空间
N 读取匹配到的行的下一行追加至模式空间
d 删除模式空间中的行
D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使
用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
|
#默认sed会将输入信息直接输出
#sed '/^#/d;/^$/d' /etc/httpd/conf/httpd.conf
#不显示注释行和空行
#删除所有以#开头的行
[root@centos8 ~]#sed -i '/^#/d' fstab
#只显示非#开头的行
[root@centos8 ~]#sed -n '/^#/!p' fstab
#修改网卡配置
[root@centos8 ~]#sed -Ei.bak '/^GRUB_CMDLINE_LINUX/s/(.*)(")$/\1
net.ifnames=0\2/' /etc/default/grub
搜索替换和&
#sed -nr 's/r..t/&er/gp' /etc/passwd
获取分区利用率
#df | sed -En '/^\/dev\/sd/s@.* ([0-9]+)%.*@\1@p'
取IP 地址
#ifconfig eth0 | sed -rn '2s/(.*inet )([0-9].*)( netmask.*)/\2/p'
#取目录名
#echo /etc/sysconfig/ | sed -rn 's#(.*)/([^/]+)/?#\1#p'
#取基名
#echo /etc/sysconfig/ | sed -rn 's#(.*)/([^/]+)/?#\2#p'
取文件的前缀和后缀
#echo a.b.tar.gz | sed -rn 's@.*\.([^.]+)\.([^.]+)$@\1.\2@p'
将#开头的行删除#
#sed -ri.bak '/^#/s/^#//' /etc/fstab
变量实现多点编辑配置文件
#sed -ri.bak -e 's/^Listen 80/Listen '$port'/' -e "/ServerName/c ServerName `hostname`:$port" /etc/httpd/conf/httpd.conf
|
awk
Linux上的实现gawk,文本报告生成器
|
awk [options] 'program' var=value file…
awk [options] -f programfile var=value file…
print item1, item2, ...
逗号分隔符
输出item可以字符串,也可是数值;当前记录的字段、变量或awk的表达式
如省略item,相当于print $0
固定字符符需要用“ ” 引起来,而变量和数字不需要
|
取出分区利用率
#df | awk '{print $1,$5}'
#使用扩展的正则表达式
#df | awk -F"[[:space:]]+|%" '{print $5}'
|