阅读前言: 命令行的艺术
时间工具
time命令 用于统计给定命令所花费的总时间
复制 MacBook-Pro-2:~ zhangzh $ klcr
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Thu Jul 13 09:59:59 2023 from 222.19.205.86
[zhangzh@node01 ~ ]$ exit
注销
Connection to 222.19.64.20 closed.
real 0m3.210s
user 0m0.050s
sys 0m0.028s
MacBook-Pro-2:~ zhangzh $ type klcr
klcr is aliased to `time ssh -XY klcr'
MacBook-Pro-2:~ zhangzh$
cal命令 打印当前日历
参数说明
-3 显示最近三个月的日历 -C 使用校准模式 -h 显示帮助信息 -j 显示在当年中的第几天(儒略日) -l 单月份输出日历 -m 将星期一作为每月的第一天 -s 将星期天作为每月的第一天 -V 显示版本信息 -y 显示当年的日历
date命令 显示或设定系统的日期与时间
在显示方面,使用者可以设定显示格式 ,格式设定为一个加号后接数个标记,可用的标记列表如下:
复制 %% 输出字符 %
%a 星期几的缩写 (Sun..Sat)
%A 星期的完整名称(Sunday..Saturday)。
%b 缩写的月份名称(例如,Jan)
%B 完整的月份名称(例如,January)
%c 本地日期和时间(例如,Thu Mar 3 23:05:25 2005)
%C 世纪,和%Y类似,但是省略后两位(例如,20)
%d 日 (01..31)
%D 日期,等价于%m/%d/%y
%e 一月中的一天,格式使用空格填充,等价于%_d
%F 完整的日期;等价于 %Y-%m-%d
%g ISO 标准计数周的年份的最后两位数字
%G ISO 标准计数周的年份,通常只对%V有用
%h 等价于 %b
%H 小时 (00..23)
%I 小时 (01..12)
%j 一年中的第几天 (001..366)
%k 小时,使用空格填充 ( 0..23); 等价于 %_H
%l 小时, 使用空格填充 ( 1..12); 等价于 %_I
%m 月份 (01..12)
%M 分钟 (00..59)
%n 新的一行,换行符
%N 纳秒 (000000000..999999999)
%p 用于表示当地的AM或PM,如果未知则为空白
%P 类似 %p, 但是是小写的
%r 本地的 12 小时制时间(例如 11:11:04 PM)
%R 24 小时制 的小时与分钟; 等价于 %H:%M
%s 自 1970-01-01 00:00:00 UTC 到现在的秒数
%S 秒 (00..60)
%t 插入水平制表符 tab
%T 时间; 等价于 %H:%M:%S
%u 一周中的一天 (1..7); 1 表示星期一
%U 一年中的第几周,周日作为一周的起始 (00..53)
%V ISO 标准计数周,该方法将周一作为一周的起始 (01..53)
%w 一周中的一天(0..6),0代表星期天
%W 一年中的第几周,周一作为一周的起始(00..53)
%x 本地的日期格式(例如,12/31/99)
%X 本地的日期格式(例如,23:13:48)
%y 年份后两位数字 (00..99)
%Y 年
%z +hhmm 格式的数值化时区格式(例如,-0400)
%:z +hh:mm 格式的数值化时区格式(例如,-04:00)
%::z +hh:mm:ss格式的数值化时区格式(例如,-04:00:00)
%:::z 数值化时区格式,相比上一个格式增加':'以显示必要的精度(例如,-04,+05:30)
%Z 时区缩写 (如 EDT)
若是不以加号作为开头,则表示要设定时间,而时间格式为 MMDDhhmm[[CC]YY][.ss],其中 MM 为月份,DD 为日,hh 为小时,mm 为分钟,CC 为年份前两位数字,YY 为年份后两位数字,ss 为秒数。
使用权限:所有使用者。
当不希望出现无意义的 0 时(比如说 1999/03/07),则可以在标记中插入 - 符号,比如说 date '+%-H:%-M:%-S' 会把时分秒中无意义的 0 给去掉,像是原本的 08:09:04 会变为 8:9:4。另外,只有取得权限者(比如说 root)才能设定系统时间。
当您以 root 身分更改了系统时间之后,请记得以 clock -w 来将系统时间写入 CMOS 中,这样下次重新开机时系统时间才会持续保持最新的正确值。
实例
显示当前时间
复制 # date
Tue May 24 09:29:43 CST 2022
# date '+%c'
Tue 24 May 2022 09:30:03 AM CST
# date '+%D' //显示完整的时间
05/24/22
# date '+%x' //显示数字日期
05/24/2022
# date '+%T' //显示日期,年份用四位数表示
14:09:31
# date '+%X' //显示24小时的格式
09:31:31 AM
格式化输出:
复制 # date +"%Y-%m-%d"
2009-12-07
输出昨天日期:
复制 # date -d "1 day ago" +"%Y-%m-%d"
2012-11-19
输出 2 秒后的时间:
复制 # date -d "2 second" +"%Y-%m-%d %H:%M.%S"
2012-11-20 14:21.31
传说中的 1234567890 秒:
复制 # date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%M:%S"
2009-02-13 23:02:30
或者:
复制 # date -d@1234567890 +"%F %T"
2009-02-13 23:02:30
时间格式转换:
复制 # date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S"
2009/12/12 00:00.00
apache 格式转换:
复制 # date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S"
2009-12-05 00:00.37
格式转换后时间游走:
复制 # date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S"
2007-12-05 00:00.37
按自己的格式输出
复制 # date '+usr_time: $1:%M %P -hey'
usr_time: $1:16 下午 -hey
显示时间后跳行,再显示目前日期
显示月份与日数
显示日期与设定时间(12:34:56)
时间加减操作:
复制 date +%Y%m%d # 显示年月日
date -d "+1 day" +%Y%m%d # 显示后一天的日期
date -d "-1 day" +%Y%m%d # 显示前一天的日期
date -d "-1 month" +%Y%m%d # 显示上一月的日期
date -d "+1 month" +%Y%m%d # 显示下一月的日期
date -d "-1 year" +%Y%m%d # 显示前一年的日期
date -d "+1 year" +%Y%m%d # 显示下一年的日期
设定时间:
复制 date -s # 设置当前时间,只有root权限才能设置,其他只能查看
date -s 20120523 # 设置成20120523,这样会把具体时间设置成00:00:00
date -s 01:01:01 # 设置具体时间,不会对日期做更改
date -s "01:01:01 2012-05-23" # 这样可以设置全部时间
date -s "01:01:01 20120523" # 这样可以设置全部时间
date -s "2012-05-23 01:01:01" # 这样可以设置全部时间
date -s "20120523 01:01:01" # 这样可以设置全部时间
复制 [zhangzh@node01 alldata]$ cal
九月 2023
日 一 二 三 四 五 六
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
[zhangzh@node01 alldata]$ date
2023年 09月 07日 星期四 21:52:19 CST
type命令 显示指定命令的类型
复制 MacBook-Pro-2:~ zhangzh $ type ls
ls is hashed (/bin/ls)
MacBook-Pro-2:~ zhangzh $ type time
time is a shell keyword
MacBook-Pro-2:~ zhangzh $ time type time
time is a shell keyword
real 0m0.003s
user 0m0.000s
sys 0m0.000s
数值计算
expr命令 是一个手工命令行计数器
用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
复制 [zhangzh@node01 alldata]$ expr 3+2
3+2
[zhangzh@node01 alldata]$ expr 3 + 2
5
[zhangzh@node01 alldata]$ expr 3 % 2
1
[zhangzh@node01 alldata]$ expr 3 \* 2 # 防止*被bash误判
6
[zhangzh@node01 alldata]$ expr 3 / 2
1
[zhangzh@node01 alldata]$ expr 3. / 2
expr: 非整数参数
[zhangzh@node01 alldata]$ expr 3 / 2
1
[zhangzh@node01 alldata]$ expr length "this is a test" # 统计字符长度
14
[zhangzh@node01 alldata]$ expr substr "this is a test" 3 5# 统计3-5的非空白字符
is is
[zhangzh@node01 alldata]$ expr substr "this is a test" 3 6
is is
[zhangzh@node01 alldata]$ expr substr "this is a test" 3 7
is is a
[zhangzh@node01 alldata]$ expr index "sarasara" a #统计字符a出现的位置
2
[zhangzh@node01 alldata]$ expr index "s arasara" a
3
seq命令 填充数字
用于以指定增量从首数开始打印数字到尾数,全拼为<Sequence>
即产生从某个数到另外一个数之间的所有整数,并且可以对整数的格式、宽度、分割符号进行控制。
复制 [root@linus ~ ]$ seq 1 4
1
2
3
4
[root@linus ~ ]$ seq 4 # 最大数补全
1
2
3
4
[root@linus ~ ]$ seq -w 10 # 根据位数补全
01
02
03
04
05
06
07
08
09
10
[root@linus ~ ]$ seq -s : 10
1:2:3:4:5:6:7:8:9:10
1
2
[root@linus ~ ]$ seq -s " " 10 # 制定分隔符补全
1 2 3 4 5 6 7 8 9 10
bc命令 计算器
<basic alculator> 是任意精度计算器语言,通过管道符
scale=2 设小数位,2代表保留两位:
复制 $ echo 'scale=2; (2.777 - 1.4744)/1' | bc
1.30
bc 除了scale来设定小数位之外,还有ibase和obase来其它进制的运算:
复制 $ echo "ibase=2;111" | bc
7
计算平方和平方根:
复制 $ echo "10^10" | bc
10000000000
$ echo "sqrt(100)" | bc
10
factor 命令 分解因数
复制 [root@linuxcool ~ ]$ factor 60
60:2 2 3 5
[root@linuxcool ~ ]$ factor # 连续分解
60
60:2 2 3 5
1987
1987:1987
文本处理类
cat命令 打印到标准输出设备上
参数说明:
-n 或 --number :由 1 开始对所有输出的行数编号。
-b 或 --number-nonblank :和 -n 相似,只不过对于空白行不编号。
-s 或 --squeeze-blank :当遇到有连续两行以上的空白行,就代换为一行的空白行。
-v 或 --show-nonprinting :使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
-E 或 --show-ends : 在每行结束处显示 $。
-T 或 --show-tabs : 将 TAB 字符显示为 ^I。
把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里:
复制 cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里:
复制 cat -b textfile1 textfile2 >> textfile3
清空 /etc/test.txt 文档内容:
复制 cat /dev/null > /etc/test.txt
tac命令 倒序打印到标准输出设备上
wc命令 字符统计
全拼为<word count> ,用于统计指定文件中的字节数、字数、行数,并将统计结果显示输出,标准格式为wc [option] [filename]
,它会依次打印出文件的行、字符、字节大小。
复制 wc -c # 统计字节数,支持正则表达
wc -l # 统计行数
wc -w # 统计字数
wc -L # 打印最长行长度
示例
复制 [zhangzh@node01 homework]$ wc -l full_QFcrab_2.0_4.0_zen50.txt
64466 full_QFcrab_2.0_4.0_zen50.txt
[zhangzh@node01 homework]$ wc -l < full_QFcrab_2.0_4.0_zen50.txt
64466
[zhangzh@node01 homework]$ wc -l * .C
20 ex35.C
40 ex3_gaus.C
33 ex3_pdf.C
32 mypdf.C
30 ra_dec.C
14 test.C
19 theta.C
64 txt_root.C
252 total
paste命令 文本合并
用于合并文件的列/行
复制 [zhangzh@node01 homework]$ cat file # file文件的内容
xiongdan 200
lihaihui 233
lymlrl 231
[zhangzh@node01 homework]$ cat testfile # testfile文件的内容
liangyuanm ss
[zhangzh@node01 homework]$ cat testfile1 # testfile1文件的内容
huanggai 56
zhixi 73
[zhangzh@node01 homework]$ paste file testfile testfile1
xiongdan 200
lihaihui 233
lymlrl 231
liangyuanm ss
huanggai 56
zhixi 73
[zhangzh@node01 homework]$ paste -s file # 行转列显示
xiongdan 200 lihaihui 233 lymlrl 231
[zhangzh@node01 homework]$ cat testfile1 testfile2 # 练习
[zhangzh@node01 homework]$ paste testfile1 testfile2 # 观察二者的区别
join命令 合并相同文本
用于将两个文件中 ,内容相同的行连接起来
复制 MacBook-Pro:~ zhangzh $ cat file1
Hello 95
Linux 85
test 30
MacBook-Pro:~ zhangzh $ cat file2
Hello 2005
Linux 2009
test 2006
MacBook-Pro:~ zhangzh $ join file1 file2
Hello 95 2005
Linux 85 2009
test 30 2006
MacBook-Pro:~ zhangzh $ join file2 file1
Hello 2005 95
Linux 2009 85
test 2006 30
MacBook-Pro:~ zhangzh $ cat file3
Linux yes
test yes
test2 no
MacBook-Pro:~ zhangzh $ join file1 file3
Linux 85 yes
test 30 yes
fmt命令 格式化文本段落
-c, --crown-margin
:将每一段的第一行与页边对齐。
-p, --prefix
:在每一行的前面添加一个空格。
-s, --split-only
:只拆分长行,不进行换行。
-t, --tagged-paragraph
:处理标记段落而不是正常段落。
-u, --uniform-spacing
:保持输入文本中的空格不变。
-w, --width=WIDTH
:设置输出的行宽,默认为75个字符。
--help
:显示帮助信息并退出。
--version
:显示版本信息并退出。
column命令 文本对齐
将文本格式化成多个对齐、定宽的列或表格
复制 MacBook-Pro:~ zhangzh $ cat tee.txt
10.10.10.161 | SUCCESS | rc = 0 | ( stdout ) 21
10.10.10.33 | SUCCESS | rc = 0 | ( stdout ) 22
10.10.10.1 | SUCCESS | rc = 0 | ( stdout ) 62
10.10.10.129 | SUCCESS | rc = 0 | ( stdout ) 65
10.10.10.65 | SUCCESS | rc = 0 | ( stdout ) 144
10.10.10.97 | SUCCESS | rc = 0 | ( stdout ) 7
10.10.10.130 | SUCCESS | rc = 0 | ( stdout ) 65
10.10.10.2 | SUCCESS | rc = 0 | ( stdout ) 62
10.10.10.34 | SUCCESS | rc = 0 | ( stdout ) 22
10.10.10.162 | SUCCESS | rc = 0 | ( stdout ) 21
10.10.10.66 | SUCCESS | rc = 0 | ( stdout ) 144
10.10.10.98 | SUCCESS | rc = 0 | ( stdout ) 7
10.10.10.131 | SUCCESS | rc = 0 | ( stdout ) 65
10.10.10.3 | SUCCESS | rc = 0 | ( stdout ) 62
10.10.10.35 | SUCCESS | rc = 0 | ( stdout ) 22
10.10.10.163 | SUCCESS | rc = 0 | ( stdout ) 21
10.10.10.99 | SUCCESS | rc = 0 | ( stdout ) 7
10.10.10.67 | SUCCESS | rc = 0 | ( stdout ) 144
MacBook-Pro:~ zhangzh $ cat tee.txt | column -t
10.10.10.161 | SUCCESS | rc = 0 | ( stdout ) 21
10.10.10.33 | SUCCESS | rc = 0 | ( stdout ) 22
10.10.10.1 | SUCCESS | rc = 0 | ( stdout ) 62
10.10.10.129 | SUCCESS | rc = 0 | ( stdout ) 65
10.10.10.65 | SUCCESS | rc = 0 | ( stdout ) 144
10.10.10.97 | SUCCESS | rc = 0 | ( stdout ) 7
10.10.10.130 | SUCCESS | rc = 0 | ( stdout ) 65
10.10.10.2 | SUCCESS | rc = 0 | ( stdout ) 62
10.10.10.34 | SUCCESS | rc = 0 | ( stdout ) 22
10.10.10.162 | SUCCESS | rc = 0 | ( stdout ) 21
10.10.10.66 | SUCCESS | rc = 0 | ( stdout ) 144
10.10.10.98 | SUCCESS | rc = 0 | ( stdout ) 7
10.10.10.131 | SUCCESS | rc = 0 | ( stdout ) 65
10.10.10.3 | SUCCESS | rc = 0 | ( stdout ) 62
10.10.10.35 | SUCCESS | rc = 0 | ( stdout ) 22
10.10.10.163 | SUCCESS | rc = 0 | ( stdout ) 21
10.10.10.99 | SUCCESS | rc = 0 | ( stdout ) 7
10.10.10.67 | SUCCESS | rc = 0 | ( stdout ) 144
yes命令 输出指定字符/串
输出指定的字符串,直到 yes 进程被杀死。常用于产生大文件或回答 yes/no ,不加文本默认输出y
复制 [zhangzh@node01 0307]$ touch { a..z}.txt
[zhangzh@node01 0307]$ ls
a.txt c.txt e.txt g.txt i.txt k.txt m.txt o.txt q.txt s.txt u.txt w.txt y.txt
b.txt d.txt f.txt h.txt j.txt l.txt n.txt p.txt r.txt t.txt v.txt x.txt z.txt
[zhangzh@node01 0307]$ rm { a..z}.txt
rm:是否删除普通空文件 'a.txt' ?^C
[zhangzh@node01 0307]$ yes | rm {a..z}.txt
rm:是否删除普通空文件 'a.txt'?rm:是否删除普通空文件 'b.txt'?rm:是否删除普通空文件 'c.txt'?rm:是否删除普通空文件 'd.txt'?rm:是否删除普通空文件 'e.txt'?rm:是否删除普通空文件 'f.txt'?rm:是否删除普通空文件 'g.txt'?rm:是否删除普通空文件 'h.txt'?rm:是否删除普通空文件 'i.txt'?rm:是否删除普通空文件 'j.txt'?rm:是否删除普通空文件 'k.txt'?rm:是否删除普通空文件 'l.txt'?rm:是否删除普通空文件 'm.txt'?rm:是否删除普通空文件 'n.txt'?rm:是否删除普通空文件 'o.txt'?rm:是否删除普通空文件 'p.txt'?rm:是否删除普通空文件 'q.txt'?rm:是否删除普通空文件 'r.txt'?rm:是否删除普通空文件 's.txt'?rm:是否删除普通空文件 't.txt'?rm:是否删除普通空文件 'u.txt'?rm:是否删除普通空文件 'v.txt'?rm:是否删除普通空文件 'w.txt'?rm:是否删除普通空文件 'x.txt'?rm:是否删除普通空文件 'y.txt'?rm:是否删除普通空文件 'z.txt'?[zhangzh@node01 0307]$ ls
[zhangzh@node01 0307]$ ls
[zhangzh@node01 0307]$
expand和unexpand命令 制表符与空格之间转换
stat命令 显示文件状态信息
包括文件的类型、权限、大小、所属用户和组、访问时间、修改时间、创建时间等详细信息。它可以用于检查文件的状态以及了解文件的属性。
lockfile命令 使文件只能通过 rm -f
移除
jq命令 一个灵活的轻量级命令行JSON处理器
head命令 查看文件开头部分
-n
参数用来查看前多少行的内容,E.g. head -n 200 filename
查看filename
前200
行的内容;
-c
参数用来查看前多少个字节。
tail命令 查看文件尾部内容
-f
参数可以循环读取文件末尾的内容,一般用来监视输出的日志,E.g. tail -f data.log
-n
参数显示文件的尾部 n 行内容,默认显示最后 10 行,E.g. tail -n 5 notes.log
tail -n +5 notes.log
输出notes.log
文件的第 +5 行至文档末尾。
banner命令
复制 MacBook-Pro:PowerPoint zhangzh$ banner -w 45 hello
# ##
###############################
###############################
###############################
# #
##
##
# ###
##################
#################
##############
######
###########
###############
### ## ###
## ## ##
# ## #
# ## ##
# ## ##
# #########
# #######
####
# ##
###############################
###############################
###############################
#
# ##
###############################
###############################
###############################
#
######
###########
###############
### ###
## ##
# #
# ##
## ##
#### ####
##############
##########
nohup命令 在系统后台不挂断地运行命令
在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out
文件中。
& :让命令在后台执行,终端退出后命令仍旧执行。
实例
以下命令在后台执行 root 目录下的 runoob.sh 脚本:
复制 nohup /root/runoob.sh &
在终端如果看到以下输出说明运行成功:
复制 appending output to nohup.out
这时打开 root 目录就看到生成了 nohup.out 文件。
如果要停止运行,你需要使用以下命令查找到 nohup 运行脚本到 PID,然后使用 kill 命令来关闭:
复制 ps -aux | grep "runoob.sh"
以下命令在后台执行 root 目录下的 runoob.sh 脚本,并重定向输入到 runoob.log 文件:
复制 nohup /root/runoob.sh &> runoob.log &
pv命令 使用进度条显示进程
复制 [zhangzh@node01 ~ ]$ ls
asgamma bin grb other practice software wl wl_old yes.txt
[zhangzh@node01 ~ ]$ pv yes.txt > yes.bak
7.65GiB 0:00:13 [ 464MiB/s] [======================================> ] 78% ETA 0:00:03
[zhangzh@node01 ~ ]$ pv yes.txt | zip > yes.txt.zip
adding: - 107MiB 0:00:01 [ 107MiB/s] [> ] 1% 9.78GiB 0:01:33 [ 107MiB/s] [==================================================>] 100%
( deflated 100% )
tree命令 以树状图形式显示文件结构
复制 tree -d 只显示文件夹
tree -D 显示文件的最后修改时间 tree -C 颜色显示
tree -f 显示文件全路径
tree -L n n表示显示项目的层级,n=3即只显示项目的三层结构 tree -L 2 只显示2层
tree -P .pl 只显示文件目录和.pl的perl文件。
sort命令 将文本文件内容排序
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-u 意味着是唯一的(unique),输出的结果是去完重了的。
+<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
[-k field1[,field2]] 按指定的列进行排序。
在使用 sort 命令以默认的式对文件的行进行排序,使用的命令如下:
sort 命令将以默认的方式将文本文件的第一列以 ASCII 码的次序排列,并将结果输出到标准输出。
使用 cat 命令显示 testfile 文件可知其原有的排序如下:
复制 $ cat testfile # testfile文件原有排序
test 30
Hello 95
Linux 85
使用 sort 命令重排后的结果如下:
复制 $ sort testfile # 重排结果
Hello 95
Linux 85
test 30
使用 -k 参数设置对第二列的值进行重排,结果如下:
复制 $ sort testfile -k 2
test 30
Linux 85
Hello 95
uniq命令 检查及删除文本文件中重复出现的行列
-c或--count 在每列旁边显示该行重复出现的次数。
-d或--repeated 仅显示重复出现的行列。
-f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。
-s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。
-w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。
[输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
[输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
文件testfile中第 2、3、5、6、7、9行为相同的行,使用 uniq 命令删除重复的行,可使用以下命令:
testfile中的原有内容为:
复制 $ cat testfile #原有内容
test 30
test 30
test 30
Hello 95
Hello 95
Hello 95
Hello 95
Linux 85
Linux 85
使用uniq 命令删除重复的行后,有如下输出结果:
复制 $ uniq testfile #删除重复行后的内容
test 30
Hello 95
Linux 85
检查文件并删除文件中重复出现的行,并在行首显示该行重复出现的次数。使用如下命令:
结果输出如下:
复制 $ uniq -c testfile #删除重复行后的内容
3 test 30 #前面的数字的意义为该行共出现了3次
4 Hello 95 #前面的数字的意义为该行共出现了4次
2 Linux 85 #前面的数字的意义为该行共出现了2次
当重复的行并不相邻时,uniq 命令是不起作用的,即若文件内容为以下时,uniq 命令不起作用:
复制 $ cat testfile1 # 原有内容
test 30
Hello 95
Linux 85
test 30
Hello 95
Linux 85
test 30
Hello 95
Linux 85
这时我们就可以使用 sort:
复制 $ sort testfile1 | uniq
Hello 95
Linux 85
test 30
统计各行在文件中出现的次数:
复制 $ sort testfile1 | uniq -c
3 Hello 95
3 Linux 85
3 test 30
在文件中找出重复的行:
复制 $ sort testfile1 | uniq -d
Hello 95
Linux 85
test 30
join命令 将两个文件中,指定栏位内容相同的行连接起来
复制 -a <1或2> 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
-e <字符串> 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。
-i或--igore-case 比较栏位内容时,忽略大小写的差异。
-t <字符> 使用栏位的分隔字符。
-v <1或2> 跟-a相反,只显示文件中没有相同栏位的行。
-1 <栏位> 连接[文件1]指定的栏位。
-2 <栏位> 连接[文件2]指定的栏位。
======================================
[zhangzh@node01 ~ ]$ cat 1
Hello a 95
Linux a 85
test b 30
[zhangzh@node01 ~ ]$ cat 2
Hello a 2005
Linux b 2009
tast c 2006
[zhangzh@node01 ~ ]$ join 1 2
Hello a 95 a 2005
Linux a 85 b 2009
[zhangzh@node01 ~ ]$ join -1 2 -2 2 1 2 // 按文件1和2的2栏合并
a Hello 95 Hello 2005
a Linux 85 Hello 2005
b test 30 Linux 2009
[zhangzh@node01 ~ ]$ join -a1 -a2 -1 2 -2 2 1 2 // 输出文件1,2的不匹配行
a Hello 95 Hello 2005
a Linux 85 Hello 2005
b test 30 Linux 2009
c tast 2006
[zhangzh@node01 ~ ]$ join -e "NU" -a1 -a2 -1 2 -2 2 1 2 // 将NU作为空字符填充
a Hello 95 NU Hello 2005 NU
a Linux 85 NU Hello 2005 NU
b test 30 NU Linux 2009 NU
c tast 2006 NU
[zhangzh@node01 ~ ]$ join -t "," 1 2 // 将逗号作为分隔
参考
https://www.runoob.com/linux/linux-command-manual.html