1.4 Linux 命令附录

阅读前言:命令行的艺术


时间工具

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

显示时间后跳行,再显示目前日期

date '+%T%n%D'

显示月份与日数

date '+%B %d'

显示日期与设定时间(12:34:56)

date --date '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>是任意精度计算器语言,通过管道符

$ echo "15+5" | bc
20

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 移除

pandoc命令 Markdown,HTML,以及所有文档格式之间的转换

jq命令 一个灵活的轻量级命令行JSON处理器

head命令 查看文件开头部分

-n参数用来查看前多少行的内容,E.g. head -n 200 filename 查看filename200行的内容;

-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 行至文档末尾。

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命令 将文本文件内容排序

  • -b 忽略每行前面开始出的空格字符。

  • -c 检查文件是否已经按照顺序排序。

  • -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。

  • -f 排序时,将小写字母视为大写字母。

  • -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。

  • -m 将几个排序好的文件进行合并。

  • -M 将前面3个字母依照月份的缩写进行排序。

  • -n 依照数值的大小排序。

  • -u 意味着是唯一的(unique),输出的结果是去完重了的。

  • -o<输出文件> 将排序后的结果存入指定的文件。

  • -r 以相反的顺序来排序。

  • -t<分隔字符> 指定排序时所用的栏位分隔字符。

  • +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

  • --help 显示帮助。

  • --version 显示版本信息。

  • [-k field1[,field2]] 按指定的列进行排序。

在使用 sort 命令以默认的式对文件的行进行排序,使用的命令如下:

sort testfile 

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=<字符位置> 忽略比较指定的字符。

  • -u或--unique 仅显示出一次的行列。

  • -w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。

  • --help 显示帮助。

  • --version 显示版本信息。

  • [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;

  • [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。

文件testfile中第 2、3、5、6、7、9行为相同的行,使用 uniq 命令删除重复的行,可使用以下命令:

uniq testfile 

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 

结果输出如下:

$ 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

最后更新于