- 连接文件并打印到标准输出设备 - 使用 cat
- 显示指定文件的开头若干行 - 使用 head
- 显示指定文件的末尾若干行,常用于实时打印日志文件内容 - 使用 tail
- 显示文件内容,每次显示一屏 - 使用 more
- 显示文件内容,每次显示一屏 - 使用 less
- 自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等 - 使用 sed
- 文本编辑器 - 使用 vim或vi
- 使用正则表达式搜索文本,并把匹配的行打印出来 - 使用 grep
- 显示文件某一列并且可以排序或输出筛选出来的内容 - 使用 awk
1. cat
连接多个文件并打印到标准输出。
语法:
cs
cat (选项) (文件名)
选项:
bash
-A, --show-all 等价于"-vET"组合选项。
-b, --number-nonblank 只对非空行编号,从1开始编号,覆盖"-n"选项。
-e 等价于"-vE"组合选项。
-E, --show-ends 在每行的结尾显示'$'字符。
-n, --number 对所有行编号,从1开始编号。
-s, --squeeze-blank 压缩连续的空行到一行。
-t 等价于"-vT"组合选项。
-T, --show-tabs 使用"^I"表示TAB(制表符)。
-v, --show-nonprinting 使用"^"和"M-"符号显示控制字符,除了LFD(line feed,即换行符'\n')和TAB(制表符)。
例:
cs
# 合并显示多个文件
cat ./1.log ./2.log ./3.log
# 显示文件中的非打印字符、tab、换行符
cat -A test.log
# 压缩文件的空行
cat -s test.log
# 显示文件并在所有行开头附加行号
cat -n test.log
# 显示文件并在所有非空行开头附加行号
cat -b test.log
# 将标准输入的内容和文件内容一并显示
echo '######' |cat - test.log
注意:
- 当使用
cat
命令查看体积较大的文件 时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容,为了控制滚屏,可以按Ctrl+s
键停止滚屏;按Ctrl+q
键恢复滚屏;按Ctrl+c
(中断)键可以终止该命令的执行,返回Shell提示符状态。- 建议您查看体积较大的文件 时使用
less
、more
命令或emacs
、vi
等文本编辑器。
2. head
- 在未指定行数时默认显示前10行。
- 处理多个文件时会在各个文件之前附加含有文件名的行。
- 当没有文件或文件为
-
时,读取标准输入。
语法:
cs
head (选项) (文件名)
选项:
cs
-c, --bytes=[-]NUM 显示前NUM字节;如果NUM前有"-",那么会打印除了文件末尾的NUM字节以外的其他内容。
-n, --lines=[-]NUM 显示前NUM行而不是默认的10行;如果NUM前有"-",那么会打印除了文件末尾的NUM行以外的其他行。
-q, --quiet, --silent 不打印文件名行。
-v, --verbose 总是打印文件名行。
-z, --zero-terminated 行终止符为NUL而不是换行符。
例:
cs
# 查看历史文件的前6行:
[user2@pc ~]$ head -n 6 ~/.bash_history
#1575425555
cd ~
#1575425558
ls -lh
#1575425562
vi ~/Desktop/ZhuangZhu-74.txt
# 查看多个文件:
[user2@pc ~]$ head -n ~/.bash_history ~/.bashrc
==> /allhome/user2/.bash_history <==
#1575425555
cd ~
#1575425558
ls -lh
#1575425562
vi ~/Desktop/ZhuangZhu-74.txt
#1575425566
uptime
#1575425570
find ~/ -maxdepth 3 -name 'test.sh' -exec lh {} \;
==> /allhome/user2/.bashrc <==
# .bashrc
# forbid use Ctrl+D to exit shell.
set -o ignoreeof
# Source global definitions.
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
3. tail
- 默认在屏幕上显示指定文件的末尾10行。
- 处理多个文件时会在各个文件之前附加含有文件名的行。
语法:
cs
tail (选项) (文件名)
选项:
cs
-c, --bytes=NUM 输出文件尾部的NUM(NUM为整数)个字节内容。
-f, --follow[={name|descript}] 显示文件最新追加的内容。"name"表示以文件名的方式监视文件的变化。
-F 与 "--follow=name --retry" 功能相同。
-n, --line=NUM 输出文件的尾部NUM(NUM位数字)行内容。
--pid=<进程号> 与"-f"选项连用,当指定的进程号的进程终止后,自动退出tail命令。
-q, --quiet, --silent 当有多个文件参数时,不输出各个文件名。
--retry 即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。使用此选项时需要与选项"--follow=name"连用。
-s, --sleep-interal=<秒数> 与"-f"选项连用,指定监视文件变化时间隔的秒数。
-v, --verbose 当有多个文件参数时,总是输出各个文件名。
例:
cs
#(显示文件file的最后10行)
tail file
#(显示文件file的内容,从第20行至文件末尾)
tail -n +20 file
#(显示文件file的最后10个字节)
tail -c 10 file
# 显示 mail.log 最后的 25 行
tail -25 mail.log
# 等同于--follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止
tail -f mail.log
# 等同于--follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
tail -F mail.log
4. more
more命令 是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。
该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:--More--(XX%)可以用下列不同的方法对提示做出回答:
- 按
Space
键:显示文本的下一屏内容。- 按
Enter
键:只显示文本的下一行内容。- 按斜线符
|
:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。- 按H键:显示帮助屏,该屏上有相关的帮助信息。
- 按B键:显示上一屏内容。
- 按Q键:退出more命令。
语法:
cs
more (选项) (文件名)
选项:
cs
-<数字>:指定每屏显示的行数;
-d:显示"[press space to continue,'q' to quit.]"和"[Press 'h' for instructions]";
-c:不进行滚屏操作。每次刷新这个屏幕;
-s:将多个空行压缩成一行显示;
-u:禁止下划线;
+<数字>:从指定数字的行开始显示。
例:
cs
# 显示文件file的内容,但在显示之前先清屏,并且在屏幕的最下方显示完成的百分比。
more -dc file
# 显示文件file的内容,每10行显示一次,而且在显示之前先清屏。
more -c -10 file
5. less
less 命令的作用与 more 十分相似,都可以用来浏览文字档案的内容,不同的是 less 命令允许用户向前或向后浏览文件,而 more 命令只能向前浏览。用 less 命令显示文件时,用 PageUp 键向上翻页,用 PageDown 键向下翻页。要退出 less 程序,应按 Q 键。
语法:
cs
less (选项) (文件名)
选项:
-e:文件内容显示完毕后,自动退出;
-f:强制显示文件;
-g:不加亮显示搜索到的所有关键词,仅显示当前显示的关键字,以提高显示速度;
-l:搜索时忽略大小写的差异;
-N:每一行行首显示行号;
-s:将连续多个空行压缩成一行显示;
-S:在单行显示较长的内容,而不换行显示;
-x<数字>:将TAB字符显示为指定个数的空格字符。
-r:能够显示设置的颜色。
命令 | 行为 |
---|---|
Page UP or b | 向上翻滚一页 |
Page Down or space | 向下翻滚一页 |
UP Arrow | 向上翻滚一行 |
Down Arrow | 向下翻滚一行 |
G | 移动到最后一行 |
1G or g | 移动到开头一行 |
/charaters | 向前查找指定的字符串 |
n | 向前查找下一个出现的字符串,这个字符串是之前所指定查找的 |
h | 显示帮助屏幕 |
q | 退出 less 程序 |
6. sed
sed 是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
语法:
cs
sed (选项) (条件) (指令) (文件名)
选项:
cs
-n:(屏蔽默认输出,默认sed会输出读取文档的全部内容)
-r:(支持扩展正则)
-i:(修改源文件)
条件:
- 条件可以是行号或者/正则/,没有条件时默认为所有行都执行指令
正则表达式看这:
指令:
p: 输出
d:删除
s:替换
i:行前插入
a:行后插入
c:替换整行
例1:p输出
cs
# 行号案例
sed -n '3p' user #输出第3行
sed -n '2,4p' user #输出2~4行
sed -n '2p;4p' user #输出第2行与第4行
sed -n '3,+1p' user #输出第3行以及后面1行
sed -n '1~2p' /etc/passwd #输出奇数行
sed -n '2~2p' test.txt #输出偶数行
# 使用正则当条件
sed -n '/^root/p' user #输出以root开头的行
sed -n '/root/p' user #输出包含root的行
sed -nr '/^root|^bin/p' user #输出以root开头的行或bin开头的行,|是扩展正则,需要r选项
# 特殊用法
sed -n '1!p' user #输出除了第1行的内容,!是取反
sed -n '$p' user #输出最后一行
sed -n '=' user #输出行号,如果是$=就是最后一行的行号
以上操作,如果去掉-n,在将p指令改成d指令就是删除
例2:s替换
sed命令的s替换基本功能(s/旧内容/新内容/选项):
cs
sed 's/2017/6666/' shu.txt #把所有行的第1个2017替换成6666
sed 's/2017/6666/2' shu.txt #把所有行的第2个2017替换成6666
sed '1s/2017/6666/' shu.txt #把第1行的第1个2017替换成6666
sed '3s/2017/6666/3' shu.txt #把第3行的第3个2017替换成6666
sed 's/2017/6666/g' shu.txt #所有行的所有个2017都替换
sed '/2024/s/2017/6666/g' shu.txt #找含有2024的行,将里面的所有2017替换成6666
例3:i行前插入
cs
sed 'a 666' user #所有行的下面追加666
sed '1a 666' user #第1行的下面追加666
sed '/^bin/a 666' user #在以bin开头的行的下面追加666
例4:a行后插入
cs
sed 'i 666' user #所有行的上面添加666
sed '5i 666' user #第5行的上面添加666
sed '$i 666' user #最后1行的上面添加666
例5:c替换整行
cs
sed 'c 666' user #所有行都替换成666
sed '1c 666' user #替换第1行为666
定界符:
- 以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符:
rubysed 's:test:TEXT:g' sed 's|test|TEXT|g'
- 定界符出现在样式内部时,需要使用 \ 进行转义:
rubysed 's/\/bin/\/usr\/local\/bin/g'
注意:
以上操作只是输出文件内容,要是需要修改就加上 i
sed -i (条件) (指令) (文件名)
7. vim或vi
这个是我之前写的,比较详细,在这里就不多做说明了
8. grep
grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。
语法:
cs
grep (选项) (条件)(文件名)
选项:
cs
-c # 统计匹配行数。
-E # 能使用扩展正则表达式。
-i # 忽略大小写。
-n # 显示匹配结果所在的行号。
-q # 静默输出。
-v # 条件取反。
--color # 标红显示匹配字段。
9. awk
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
awk处理文本时,读文件前、读取文件内容中、读文件后后这三个环节是如何表示的?
- BEGIN{ } 文件前处理:awk没有读入行之前 要执行的动作; 一般对数据作初始化操作,可以单独使用。
- { } 行处理:对awk读入的每一行进行处理,可以单独使用。
- END{ } 文件后处理:awk 把所有的行都处理完后要执行的动作,一般输出数据处理的结果。可以单独使用
语法:
cs
awk [选项] '[条件]{指令}' 文件
# awk 脚本基本语句
awk [选项] 'BEGIN{ print "start" } '[条件]{指令}' END{ print "end" }' 文件e
awk常用内置变量:
cs
$0 文本当前行的全部内容
$1 文本的第1列
$2 文件的第2列
$3 文件的第3列,依此类推
NR 文件当前行的行号
NF 文件当前行的列数(有几列)
选项:
cs
-F 指定分隔符
例1:基本操作
cs
# 基本操作
awk '{print}' abc.txt #输出所有
awk '{print $2}' abc.txt #输出所有行的第2列
awk '/to/{print $1}' abc.txt #输出有to的那行的第1列
awk '{print $0}' abc.txt #输出所有行所有列
awk '{print $0,$1}' abc.txt #输出所有行所有列的第1列
awk '{print NR}' abc.txt #输出所有行的行号
awk '{print NR,$0}' abc.txt #输出所有行的行号,所有列
awk '{print NR,NF}' abc.txt #输出所有行的行号,列号(有几列)
awk '/^bin/{print NR}' user #找以bin开头的行,显示该行的行号
# -F 可指定分隔符
awk -F: '{print $1}' user #文档中如果没有空格,可以用F修改分隔符
awk -F: '{print $1,$6}' user #使用冒号作为列的分隔符,显示第1、6列
# awk还识别多种单个的字符,比如以":"或"/"分隔
awk -F [:/] '/^root/{print $1,$10}' user
# awk的print指令不仅可以打印变量,还可以打印常量
awk -F: '{print $1" 的家目录是 "$6}' user #输出常量,加双引号即可
例2:awk处理条件
cs
# 使用正则设置条件,/正则/ ~ 包含 !~不包含
awk -F: '$6~/root/{print}' user #输出第6列包含root的行
awk -F: '$6~/bin/{print}' user #输出第6列包含bin的行
awk -F: '$6!~/bin/{print}' user #输出第6列不包含bin的行
# 使用数值/字符串比较设置条件
# 比较符号:==(等于) !=(不等于) >(大于) >=(大于等于) <(小于) <=(小于等于)
awk -F: '$3<3{print}' user #输出第3列小于3的行
awk -F: '$3<=3{print}' user #输出第3列小于等于3的行
awk -F: 'NR==2{print}' user #输出第2行
awk -F: 'NR>2{print}' user #输出行号大于2的行
# 逻辑测试条件
awk -F: 'NR>=3&&NR<=5{print}' user #找行号是3~5行
awk -F: 'NR==2||NR==4{print}' user #找行号是2或者4的行
awk -F: 'NR==2||NR==40{print}' user #如果只有一个条件满足就显示一个
# 当定义了条件且指令就是print时可以省略指令不写
awk -F: '$7~/bash/&&$3<=500' user #找第7列包含bash并且第3列小于等于500的行
awk 'NR==2&&NR==4' user #找行号既是2又是4的行,不存在,无输出
awk -F: '$7~/bash/&&NR<=3' user #找第7列包含bash并且行号是1~3的
awk -F: '$7~/bash/||NR<=3' user #找第7列包含bash或者行号是1~3的
# 数学运算,在条件中使用运算,找到将行号除以2余数等于0的行,然后输出该行的行号和所有列,相当于输出偶数行
awk 'NR%2==0{print NR,$0}' user
awk数组
数组是awk的灵魂,处理文本中最不能少的就是它的数组处理。因为数组索引(下标)可以是数字和字符串在awk中数组叫做关联数组(associative arrays)。awk 中的数组不必提前声明,也不必声明大小。数组元素用0或空字符串来初始化,这根据上下文而定。
定义:
cs
# 数字做数组索引(下标):
Array[1]="sun"
Array[2]="kai"
# 字符串做数组索引(下标):
Array["first"]="www"
Array["last"]="name"
Array["birth"]="1987"
# 使用中print Array[1]会打印出sun
# 使用print Array[2]会打印出ka
# 使用print["birth"]会得到1987
例:
统计Web访问量
cs
# 数组名称可以自定义其他的,通过awk数组+for循环查看日志中哪个ip来访过以及来访的次数
awk '{ip[$1]++}END{for(i in ip){print ip[i],i }}' /var/log/httpd/access_log