linux(4):文本文件编辑命令-百越白狼社区-弘客联盟新手区-弘客联盟

linux(4):文本文件编辑命令

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 进入编辑模式,然后输入一些内容:

20230928141127962-image-20230921100203484

 

然后我们按下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的内容:

20230928141101681-image-20230921094921685

 

再次使用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代表数字排序。

请登录后发表评论

随便看看