Linux:文本文件编辑命令

cat

用于查看较少内容的纯文本文件

想要显示行号可以使用-n参数:

[root@linuxprobe ~]# cat -n initial-setup-ks.cfg 
     1	#version=RHEL8
     2	# X Window System configuration information
     3	xconfig  --startxonboot
     4	# License agreement
     5	eula --agreed
     6	# Use graphical install
     7	graphical
     8	# Network information
     9	network  --bootproto=dhcp --device=ens160 --onboot=off --ipv6=auto --activate
    10	network  --bootproto=dhcp --hostname=linuxprobe.com
    11	repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream
    12	ignoredisk --only-use=sda
    13	# Use CDROM installation media
    14	cdrom
    15	# Run the Setup Agent on first boot
    16	firstboot --enable
    17	# System services
    18	services --disabled="chronyd"
    19	# Keyboard layouts
    20	keyboard --vckeymap=us --xlayouts='us'
    21	# System language
    22	lang en_US.UTF-8
以下信息省略……
more

用于查看内容较多的纯文本文件

使用cat命令一旦内容多起来就很难有一个好的阅读体验,会将所有信息全部打印在终端上面。而more只会打印一页的内容,可以通过空格或者回车进行翻页操作。并且末尾会提示阅读进度百分比。

[root@linuxprobe ~]# more initial-setup-ks.cfg 
#version=RHEL8
# X Window System configuration information
xconfig  --startxonboot
# License agreement
eula --agreed
# Use graphical install
graphical
# Network information
network  --bootproto=dhcp --device=ens160 --onboot=off --ipv6=auto --activate
network  --bootproto=dhcp --hostname=linuxprobe.com
repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream
ignoredisk --only-use=sda
# Use CDROM installation media
cdrom
# Run the Setup Agent on first boot
firstboot --enable
# System services
services --disabled="chronyd"
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

--More--(41%)

head

用于查看前面N行的纯文本文件

如果只需要查看文件的前面几行,完全用不到cat和more,使用head就好了。

例如,查看文本的前10行:

[root@linuxprobe ~]# head -n 10 initial-setup-ks.cfg 
#version=RHEL8
# X Window System configuration information
xconfig  --startxonboot
# License agreement
eula --agreed
# Use graphical install
graphical
# Network information
network  --bootproto=dhcp --device=ens160 --onboot=off --ipv6=auto --activate
network  --bootproto=dhcp --hostname=linuxprobe.com
[root@linuxprobe ~]# 
tail

用于查看纯文本文件的后N行数据,或者持续刷新日志

既然有能够查看前N行的命令,自然也少不了查看后N行的命令。

查看后10行:

[root@linuxprobe ~]# tail -n 10 initial-setup-ks.cfg 
%addon com_redhat_subscription_manager 
%end
%addon ADDON_placeholder --disable --reserve-mb=auto
%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
[root@linuxprobe ~]# 

持续监视日志:

[root@linuxprobe ~]# tail -f initial-setup-ks.cfg 
%addon com_redhat_subscription_manager 
%end
%addon ADDON_placeholder --disable --reserve-mb=auto
%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

如果文本有内容新增,终端也会实时打印出来,想要推出同时按下ctrl+c

tr

用于替换文本中的某个字符

如果想要批量替换某些字符,可以先用cat读取文本,然后利用管道符把这些文本传递给tr命令来进行替换。

例如,将cat读取到的文本替换成大写:

[root@linuxprobe ~]# cat initial-setup-ks.cfg | tr a-z A-Z
#VERSION=RHEL8
# X WINDOW SYSTEM CONFIGURATION INFORMATION
XCONFIG  --STARTXONBOOT
# LICENSE AGREEMENT
EULA --AGREED
# USE GRAPHICAL INSTALL
GRAPHICAL
# NETWORK INFORMATION
NETWORK  --BOOTPROTO=DHCP --DEVICE=ENS160 --ONBOOT=OFF --IPV6=AUTO --ACTIVATE
NETWORK  --BOOTPROTO=DHCP --HOSTNAME=LINUXPROBE.COM
REPO --NAME="APPSTREAM" --BASEURL=FILE:///RUN/INSTALL/REPO/APPSTREAM

以下信息省略……
wc

用于统计文本文件的行数,字数或字节数

  • -l:只显示行数
  • -w:只显示单词数
  • -c:只显示字节数

统计文本行数:

[root@linuxprobe ~]# wc -l initial-setup-ks.cfg 
49 initial-setup-ks.cfg

统计文本单词数:

[root@linuxprobe ~]# wc -w initial-setup-ks.cfg 
135 initial-setup-ks.cfg

统计字节数:

[root@linuxprobe ~]# wc -c initial-setup-ks.cfg 
1540 initial-setup-ks.cfg
stat

用于查看文件的具体存储细节和时间等信息

linux有三种时间状态:

  • Access Time:简称Atime,最后一次访问时间
  • Modify Time:简称Mtime,内容最后一次修改时间
  • Change Time:简称Ctime,文件属性最后一次修改时间

可以使用stat来查看这三种时间状态:

[root@linuxprobe ~]# stat initial-setup-ks.cfg 
  File: initial-setup-ks.cfg
  Size: 1540      	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 35317774    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2023-09-20 11:26:57.156484115 +0800
Modify: 2023-08-03 23:02:00.440395705 +0800
Change: 2023-08-03 23:02:00.440395705 +0800
 Birth: -
grep

用于提取文本内容

grep是用途最广泛的文本搜索匹配工具。他有很多参数,但是 -n -v这两个就占用日常使用的80%。下面是一些常用参数:

  • -b:将可执行文件(binary)当作文本文件来搜索
  • -c:仅显示找到的行号
  • -i:忽略大小写
  • -n:显示行号
  • -v:反向选择——仅列出没有"关键字"的行。

linux中/etc/passwd中保存着所有用户信息,而一旦用户的登录终端被改为了/sbin/nologin,则不再允许登录系统,因此可以使用grep来查找出不允许登录系统的用户:

[root@linuxprobe ~]# grep /sbin/nologin /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin

——————以下信息省略——————
cut

用于提取列的信息

前面有head来获取前N行的数据,也有tail来获取后N行的数据。想要获取行信息比较容易,如果想要获取列信息,首先要给定一个参数来确认以什么字符来分割列。

我们先看/etc/passwd下面的行内容:

[root@linuxprobe ~]# head -n 2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

可以观察到,这份文件的列是用冒号(:)来分隔列的,因此我们可以以冒号分隔来提取第一列内容:

[root@linuxprobe ~]# cut -d : -f 1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
dbus
systemd-coredump

——————以下信息省略——————
diff

用于比较多个文件之间的差异

它能够比较两个文件之间是否存在差异,并且可以给出具体差异在哪里。

我们先创建一个文件,并且vi编辑一下:

[root@linuxprobe ~]# touch diff_A.txt
[root@linuxprobe ~]# vi diff_A.txt 

在vi编辑器中我们按下 i 进入编辑模式,然后输入一些内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后我们按下etc退出编辑模式,然后按下shift+:,输入wq(保存并且退出)。

我们拷贝一份文件修改一下名称:

[root@linuxprobe ~]# cp diff_A.txt diff_B.txt

我们先查看这两份文件:

[root@linuxprobe ~]# cat diff_A.txt 
hello world
hello linux
hello java
hello vue
[root@linuxprobe ~]# cat diff_B.txt 
hello world
hello linux
hello java
hello vue

然后使用diff --brief来判断两份文件是否有差异:

[root@linuxprobe ~]# diff --brief diff_A.txt diff_B.txt
[root@linuxprobe ~]# 

没有打印任何信息,表面两个文件之间没有差异。

我们用vi修改一下diff_B.txt的内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再次使用diff --brief查看差异:

[root@linuxprobe ~]# diff --brief diff_A.txt diff_B.txt
Files diff_A.txt and diff_B.txt differ

可以看到终端上面已经输出了一些信息,并且表明differ有差异。

接下来我们使用diff -c来输出具体差异:

[root@linuxprobe ~]# diff -c diff_A.txt diff_B.txt 
*** diff_A.txt	2023-09-21 09:54:17.098454795 +0800
--- diff_B.txt	2023-09-21 10:00:31.151432360 +0800
***************
*** 1,4 ****
! hello world
! hello linux
! hello java
  hello vue
--- 1,3 ----
! hello worl
! hello java-ee
  hello vue
[root@linuxprobe ~]# 

有感叹号的行就是有差异的数据,代表该行与对方有差异。

uniq

用于去除文本中连续的重复行

必须要是连续的重复行才会被去除掉,如果中间夹着其他行,也是不能去除的。

我们创建一个文本文件来进行试验,如何创建如何编辑diff命令已经演示过了,我们直接看编辑完成的文本内容:

[root@linuxprobe ~]# cat test.txt 
hello world
hello world 
hello world
hello linux
hello java

我们使用uniq来去除连续重复行:

[root@linuxprobe ~]# uniq test.txt 
hello world
hello linux
hello java
sort

对文本内容再排序

这个命令需要实践才能真正掌握,排序有很多限制有很多规则。

sort参数以及作用如下:

参数作用
-f忽略大小写
-b忽略缩进与空行
-n以数值型排列
-r反向排序
-u去除重复行
-t指定字符间隔
-k设置字段范围

我们随便找一个文件来进行实验。

默认的排序规则是按照字母排序:

[root@linuxprobe ~]# sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:994:989::/var/lib/chrony:/sbin/nologin
clevis:x:983:982:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/sbin/nologin
cockpit-ws:x:982:980:User for cockpit-ws:/:/sbin/nologin
colord:x:980:978:User for colord:/var/lib/colord:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
dnsmasq:x:984:984:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin

——————以下信息省略——————

来个高难度,/etc/passwd 的文件第三列是个数字,如果我们想用这个数字来进行排序,怎么才能做到:

[root@linuxprobe ~]# sort -t : -k 3 -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

——————以下信息省略——————

这里的参数,-t设置间隔符,-k代表第几列,-n代表数字排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值