Linux 文件内容查看编辑(详解)

  • 连接文件并打印到标准输出设备 - 使用 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

注意:

  1. 当使用cat命令查看体积较大的文件 时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容,为了控制滚屏,可以按Ctrl+s键停止滚屏;按Ctrl+q键恢复滚屏;按Ctrl+c(中断)键可以终止该命令的执行,返回Shell提示符状态。
  2. 建议您查看体积较大的文件 时使用lessmore命令或emacsvi等文本编辑器。

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:(修改源文件)

条件:

  • 条件可以是行号或者/正则/,没有条件时默认为所有行都执行指令

正则表达式看这:

正则表达式-CSDN博客

指令:

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中作为定界符使用,也可以使用任意的定界符:
ruby 复制代码
sed 's:test:TEXT:g'
sed 's|test|TEXT|g'
  • 定界符出现在样式内部时,需要使用 \ 进行转义:
ruby 复制代码
sed 's/\/bin/\/usr\/local\/bin/g'

注意:

以上操作只是输出文件内容,要是需要修改就加上 i

sed -i (条件) (指令) (文件名)

7. vim或vi

这个是我之前写的,比较详细,在这里就不多做说明了

Vim文本编辑器的基本详细使用-CSDN博客

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
相关推荐
加载中loading...13 分钟前
Linux线程安全(二)条件变量实现线程同步
linux·运维·服务器·c语言·1024程序员节
安科瑞刘鸿鹏16 分钟前
校园建筑用电安全监测装置 电气火灾监测预防设备功能介绍
运维·服务器·网络·嵌入式硬件·安全·能源
课堂随想19 分钟前
【libGL error】Autodl云服务器配置ACT的conda虚拟环境生成训练数据时,遇到了libGL相关错误,涉及swrast_dri.so
运维·服务器·conda
画江湖Test1 小时前
SDK如何测试
服务器·sdk
well_fly3 小时前
Ubuntu特殊目录
linux·ubuntu
落落落sss3 小时前
es实现自动补全
大数据·服务器·elasticsearch·搜索引擎·全文检索
大熊程序猿3 小时前
ubuntu 安装k3s
linux·运维·ubuntu
luoqice3 小时前
CentOS 自启动某个应用
linux·运维·服务器
泠山3 小时前
ubuntu增加swap交换空间
linux·运维·ubuntu
JavaOpsPro4 小时前
jenkins部署手册
运维·jenkins·离线部署