-
Notifications
You must be signed in to change notification settings - Fork 15
/
10、Bash
794 lines (485 loc) · 22.5 KB
/
10、Bash
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
Shell 和其他程序一样,是介于 Kernel 和用户之间的程序,可以保护 Kernel,同时提供良好的与用户交互的界面
/etc/shells 中包含了当前系统中具有的所有 shell 程序
/etc/passwd 中定义了某个用户登录后使用的 shell 是哪个
~/.bash_history 记录了 bash 命令的历史
每次在 tty 或者在 terminal 中执行了 exit 命令都会更新 bash 历史
查看命令历史
history [n]
history [-c]
history [-raw]
系统会在登录成功后自动将 HISTFILE 里的记录加载到内存中,并在内存中不断记录新的历史记录
n 列出最近 n 条历史记录
-c 清楚内存中所有的历史记录
-a 将内存中 新的历史记录 追加 至硬盘文件中
-r 从硬盘文件 读取 历史记录 并覆写 内存
-w 将内存中 所有的历史记录 覆写 至硬盘文件中
重复执行之前的命令
!<number> 重复执行 history 编号为 <number> 的命令
!! 重复执行上个命令
!<strings> 重复执行以 <strings> 开头的最新命令
设置命令别名
alias [-p] [别名=原命令]
-p 打印当前所有的别名
别名的存储文件
当前 ~/.bashrc
全局 /etc/bashrc
取消设置别名
unalias [-a] [别名]
-a 取消全部别名
检查命令是否为 bash 的内建命令
type [-tpa] <命令>
不加参数时,若命令是 shell 内建的则显示 builtin
若命令不是 shell 内建的则显示命令位置
-t 只有三种返回
file 表示外部命令
alias 表示这是一个命令的别名
builtin 表示这是一个 shell 内建的命令
-p 若指令为外部指令,则显示完整文件名
-a 搜索 PATH 定义的位置,将所有相关的 命令/别名 都罗列出来
快速编辑命令
<Ctrl>+{u|k} 分别从光标处 向前/向后 删除指令
<Ctrl>+{a|e} 光标移动至命令的 最前端/最后端
变量名的 赋予/引用/解除
bash 中所有的变量都是 字符串,但在进行特定操作的时候, bash 会将他们自动转化为对应的类型
变量名=值
变量名和值都不能直接含有空格
变量名不能以数字开头
$变量名 / ${变量名} 变量名的调用
echo $变量名 显示变量的值
echo ${变量名} 显示变量的值
使用 双引号 引用变量的时候,会输出变量的值
使用 单引号 引用变量的时候,会输出变量的名
eg.
[ep@epct ~]$ a=xyz
[ep@epct ~]$ echo "$a"
# 返回 xyz
[ep@epct ~]$ echo '$a'
# 返回 $a
特殊用法
${<startNum>..<endNum>[..<step>]} 产生介于 <StartNum> 与 <endNum> 之间的,以 <step> 作为间距的整数序列
等价于 $(seq <startNum> [<step>] <endNum>)
eg.
echo ${3..6}
# 返回
3 4 5 6
$(命令) 可以将命令执行的输出值赋给另一个匿名的变量
eg.
ls -l /bin/modules/$(uname -r)/kernel/fs
#其中的 $(uname -r) 就输出了当前系统的版本号
使用 <变量名A>=$<变量名A>[待添加数据] 来添加数据
如果要让变量被子程序(child shell)使用,就要将该变量变成 环境变量
export <变量名>
一般来说,系统变量名 都为 大写,所以可以使用 小写 变量名 来设定自定义的变量
解除一个变量的方法
unset <变量名>
$((数学计算式)) 用于数学计算
Bash 支持 ((++i)) 或 ((i++)) 这种 C 语言的自累加写法
禁止使用 ((++${i})) 或 ((${i}++)) 这种类型的语法,者会将 i 的内容解释为字符串
((数学计算式)) 只进行计算,返回 exit code,但不返回计算的结果
$((数学计算式)) 返回 exit code 的同时也返回计算结果
$(()) 的过时用法 $[数学运算式]
env 查看环境变量(当前会话中有效)
env 常用返回值解释
<01> HOME 当前使用者主目录路径
<02> TERM 当前启动环境
tty 模式显示为 Linux
Terminal 模式则显示为 xterm 或 xterm-256color
<03> SHELL 当前使用的 Shell 类型
一般为 /bin/bash
<04> HISTSIZE shell 在内存中最大历史长度
<05> USER 当前使用者名
<06> LS_COLORS 在 ls 中特殊 格式/文件 使用的特殊颜色
以 分号 ; 隔开RGB值
以 冒号 : 隔开不同的条目
<07> MAIL 使用 mail 命令收发邮件时,查询的本地目录
<08> PATH 命令的搜索路径
以 冒号 : 隔开不同条目
具有 短路 性质,也既按照条目顺序搜索,找到第一个匹配项之后忽略后续可能有的匹配项
<09> PWD 输出当前工作路径
<10> LANG 输出当前语言环境
<11> SHLVL 当前 Shell 的深度(也就是需要几次 exit 才能退回登录界面)
<12> BASH_SUBSHELL 真正的 子进程(SubShell) 深度
sub shell 是仅调用 fork 函数产生的进程,可以完全使用父进程的所有变量
child shell 在调用了一次 fork 之后又 调用 execve 重新用 /bin/bash 程序加载了一遍 脚本 而产生的新 shell
所以 child shell 只能继承 父进程 export 之后的变量
<13> XDG_VTNR 当前使用第几个 tty 启动的 shell
<14> XDG_SESSION_ID 从开机到当前 shell 一共启动了多少了个 shell
<15> _ 返回最后一个命令的参数,若没有参数则返回最后一个命令
set 查看当前 shell 具有的变量(仅在本 shell 中有效)
<01> BASH 当前使用的 shell
<02> BASH_VERSINFO 当前 bash 版本(分字段)
<03> BASH_VERSION 当前 bash 版本
<04> COLUMNS 当前屏幕的宽度,单位 字符
<05> LINES 当前屏幕的长度,单位 字符
<06> HISTFILE 当前 bash 历史记录文件路径
<07> HISTFILESIZE bash 历史文件能够记录的最大历史数量
<08> HISTSIZE 内存能存储的 bash 历史的最大数量
<09> IFS 默认分割符号
Interal Field Seprator
默认是 空格 制表符 换行符
对应的二进制码 040 011 012
<10> HOSTTYPE 主机硬件的版本
<10> MACHTYPE 当前的系统版本
<11> OSTYPE 操作系统类型
<12> PS1 首行提示符
默认内容为 '[\u@\h \W]\$'
也就是普通行头 [ep@epct ~]$ 这个提示符的来源
<13> PS2 次行提示符
也就是跳脱行行头 > 这个提示符的来源
PS1 以及 PS2 特殊定义符
\a 一个 ASCII 响铃字符(07)
\d 以 “星期 月 日”. 的格式显示时间
\e 一个 ASCII 转义字符(033)
\h 仅显示第一个小数点之前的主机名
\H 显示完整主机名
\j 当前 shell 所处理的工作数
\l shell 终端设备的文件名
\n 新行
\r 回车
\s shell 的名称,$0 的文件名
\t 二十四小时制显示时间 HH:MM:SS
\T 十二小时制显示时间 HH:MM:SS
\@ 十二小时制显示时间 HH:MM am/pm
\A 十二小时制显示时间 HH:MM
\u 当前用户名
\v Bash 版本,仅显示 <主版本号>.<副版本号>
\V Bash 版本,显示 <主版本号>.<副版本号>.<修订版本号>
\w 显示完整的当前工作路径,主目录则会用 ~ 代替
\W 显示当前所在的目录名,调用的是 basename 函数
\! 该命令的历史编号
\# 显示当前会话下达的命令数
\$ 提示符,非 root 用户为 $ , root 用户为 #
\nnn 八进制表示的字符
\\ 反斜杠
\[ 不可打印字符序列的开始,可以用来将终端控制序列嵌入提示符中
\] 不可打印的字符序列的结束
<14> $ 当前 shell 的 PID(Process ID)
<15> ? 获取上一个命令的返回值
export 将 自定义变量转化为环境变量 set -> env
export 显示所有的变量
export <变量名> 将 自定义变量变为环境变量
读取键盘输入
read [-p <提示文字>] [-t <超时秒数>] <变量名>
变量的声明
declare [-p <变量名>]
declare/typeset [-aixr] [<变量名>=<变量值>]
declare [+x <变量名>]
不添加参数时,输出当前 shell 含有所有的变量
-p 输出指定变量名的值
-a 设定变量为 array 类型
-i 设定变量为 integer 类型
-x 默认将变量声明为 环境变量
+x 将变量重新变为 本地变量
-r 设定变量为 只读 变量
注意只读变量只有登出后才能恢复为可重新读写的状态
eg1.
[ep@epct ~]$ declare sum1=100+300+50
[ep@epct ~]$ declare -i sum2=100+300+50
[ep@epct ~]$ echo 'sum1='$sum1 'sum2='$sum2
# 返回 sum1=100+300+50 sum2=450
<1> 默认情况下,变量都是 string 类型
<2> 变量计算可以参与变量赋予
eg2.
[ep@epct ~]$ declare -i divide1=1/3
[ep@epct ~]$ echo 'divide1='$divide1
# 返回 deivide1=0
# bash不计算浮点数
数组的声明以及引用
eg.
[ep@epct ~]$ array1[0]=5
[ep@epct ~]$ echo ${array1["1"]}
# 返回 5
<1> 数组的引用必须加 大括号 {}
<2> 数组的 key value 都是 string 类型
ulimit 限制当前 shell 的系统用量
ulimit [-SHa] [数值]
不加任何参数显示修改过的限制量
-S 设定开始警告的值
-H 设定报错的值
-a 显示所有限制量
#其他参数可依照 -a 的显示搭配 -S 或 -H 修改
变量值的删除与替换(非原地修改)
变量值的删除
从头删除匹配字符(最小匹配模式)
${<变量名>#<匹配字符>}
从头删除匹配字符(最大匹配模式)
${<变量名>##<匹配字符>}
从尾删除匹配字符(最小匹配模式)
${<变量名>%<匹配字符>}
从尾删除匹配字符(最大匹配模式)
${<变量名>%%<匹配字符>}
变量值的查找替换
从头替换第一个找到的字符
${<变量名>/<匹配字符>/<新字符>}
从头替换所有找到的字符
${<变量名>//<匹配字符>/<新字符>}
变量的重设定
方法 var1不存在 var1为空 var1有值
var2=${var1-NStr} var2=NStr var2="" var2=$var1
var2=${var1:-NStr} var2=NStr var2=NStr var2=$var1
var2=${var1+NStr} var2="" var2=NStr var2=NStr
var2=${var1:+NStr} var2="" var2="" var2=NStr
var2=${var1=NStr} var1=NStr var1="" var1=$var1
var2=NStr var2="" var1=$var1
var2=${var1:=NStr} var1=NStr var1=NStr var1=$var1
var2=NStr var2=NStr var2=$var1
var2=${var1?NStr} NStr->stderr var2="" var2=$var1
var2=${var1:?NStr} NStr->stderr NStr->stderr var2=$var1
- “设定式” 替换 变量值(仅当 未指定 时起效)
:- “设定式” 替换 变量值(未指定 和 为空 都起效)
+ “追加式” 替换 变量值(只要 存在 就起效)
:+ “追加式” 替换 变量值(只有 有值 才起效)
= “设定式” 修改 变量值(只有 未设定 时起效)
:= “设定式” 修改 变量值(未指定 和 为空 都起效)
? 输出错误(仅当 未指定 时起效)
:? 输出错误(未指定 和 为空 都起效)
Bash 的两种启动状态 login 和 non-login
login 需要完整账户名和密码才能启动的状态
比如 tty 登录
non-login 未输入账户和密码就启动的状态
比如登录过后在 tty 中启动 shell
或 在登录过的 GUI 界面 启动 terminal
login 状态会读取的配置文件
<1> /etc/profile 系统级别的预设文件
<2> ~/.bash_profile 或 ~/.bash_login 或 ~/.profile 个人级别的预设文件
login 状态下 系统级别配置文件
/etc/profile 是一组判断语句,用于设定 PATH MAIL USER HOSTNAME umask
/etc/profile 还会调用外部文件 /etc/profile.d/*.sh 进行设定
/etc/profile.d/*.sh 定义了 bash 的颜色、别名等等设置
/etc/profile.d/*.sh 又会调用 /etc/locale.conf 和 /usr/share/bash-completion/completions/* 来设置 语系 与 自动补全信息
login 状态下 用户级别配置文件
~/.bash_profile ~/.bash_login ~/.profile 三者逐次寻找,短路执行
~/.bash_profile 会调用 ~/.bashrc 文件进行配置,并为 PATH 添加当前用户的特殊路径
~/.bashrc 会调用 /etc/bashrc 文件进行配置(rc 代表 runcom 可理解为 run command)
/etc/bashrc 会设定 umask PS1 的值
在不重新登录的情况下重载 /etc/profile 和 ~/.bash_profile
source <配置文件>
. <配置文件>
non-login 的状态的下的配置文件
只执行 ~/.bashrc 的内容,同样会执行 /etc/bashrc 的内容
其他相关配置文件
/etc/man_db.conf
指定了系统搜索 man page 的目录
当使用 tarball 安装程序的时候,man page 可能存放在 /usr/local/<软件名>/man 这个目录下
所以需要手动添加至 /etc/man_db.conf 中,以便被 man 调用
~/.bash_logout
当用户登出 bash 后,系统又执行了那些命令才正式结束
stty 查看当前 tty 的设置
stty -a 输出当前 tty 的所有配置
stty <命令> <快捷键> 配置某个命令的快捷键
比较重要的几个默认设置
intr = ^C 发送 interrupt 信号给当前程序
erase = ^? 向后删除字符
kill = ^U 删除当前指令行的文字
eof = ^D End of file;指令结束
start = ^Q 启用屏幕输出(用这个命令解除屏幕锁死)
stop = ^S 停止屏幕输出(会锁死屏幕)
susp = ^Z 发出 terminal stop 信号给当前程序
#其中 ^ 表示 ctrl 键, ^? 指退格键
bash 的 通配符 与 特殊符号
通配符
* 匹配从 0 到任意多个的字符
? 匹配有且仅有一个的字符
[<字符1><字符2><字符3>...] 至少匹配到一个括号内的字符
[<字符1>-<字符2>] 匹配该区间字符
[^] 排除指定的字符
eg.
/etc/cron* 匹配文件名以 cron 开头的(含 cron 本身) 的文件
/etc/????? 匹配文件名为 五个字符 的文件
/etc/*[0-9]* 匹配文件名中含有数字(含 只有数字 本身)的文件
/etc/[^a-z]* 匹配文件名以非小写字母开头的文件
特殊符号
# 注释开头
\ 转义字符
| 管道符号
; 命令分割
~ 主目录
$ 引用变量
& 后台工作
! 非运算符
/ 路径分割
> 输出重定向 覆写模式
>> 输出重定向 追加模式
< 输入重定向
<< 输入重定向
'' 单引号 不解析引号内部的变量
"" 双引号 解析引号内部含有的变量
`` (弃用)反引号 执行反引号内的命令
() 启动 subshell 执行命令
{} 命令块的组合
# 以上字符不要出现在文件名中
输入输出重定向
标准输入 stdin 文件描述符0 重导向符 < 或 <<
标准输出 stdout 文件描述符1 重导向符 > 或 >>
标准错误输出 stderr 文件描述符2 重导向符 2> 或 2>>
& 代表 文件描述符
eg.
# 二重定向 至 双文件
[ep@epct ~]$ find /home -name .bashrc > list_right 2> list_error
# 将正常的输出 定向至 list_right 将报错定向至 list_error
# 二重定向 至 单文件
[ep@epct ~]$ find /home -name .bashrc > list_all 2>&1
# 将 正常输出 重定向 至 文件 list_all
# 将 错误输出 重定向 至 文件描述符 1 也就是 正常输出
# 注意1 不可以写成 <cmd> > <file1> 2> <file1>
# 这样 stdout 和 errout 会互相覆写对方的文件内容
# 注意2 不可以写成 <cmd> 2>&1 > <file1>
# 因为 &1 还没有重定向至文件
# Tip 二重定向 至 单文件 可以简写为 <cmd> &> <file1>
/dev/null 丢弃某类输出的方法
eg.
[ep@epct ~]$ find /home -name .bashrc 2> /dev/null
# 这会让系统将错误信息定向至 /dev/null ,清除这个信息
输入重定向
eg1.
[ep@epct ~]$ cat < ~/.bachrc > catfile
# 将 ~/.bashrc 文件作为 cat 的输入源, 接着将输出的内容写入到 catfile 中
# 这个命令等价于 cat ~/.bachrc > catfile
eg2.
[ep@epct ~]$ cat << "eof" > catfile
# 这个命令会让 cat 等待用户的键盘输入直到 用户输入 eof 才会结束等待
Bash 中的 短路与操作(&&) 和 短路或操作(||)
<commandA> && <commandB> 仅当 <commandA> 的回传值($?)为 0 的时候, 执行 <commandB>
<commandA> || <commandB> 仅当 <commandA> 的回传值($?)值不为 0 的时候, 执行 <commandB>
eg1.
ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
# 以上命令会判定 abc 目录是否存在,不存在就新建一个,并创建一个名为 hehe 的文件
eg2.
ls /tmp/abc || echo "not exist" && echo "exist"
# 若 ls /tmp/abc 执行成功,则跳到 && 判定,执行 echo "exist"
# 若 ls /tmp/abc 不成功,则执行 echo "not exist"
# 并返回 echo "not exist" 执行成功,接着执行 && 判定,执行 echo "exist"
# 所以无论 ls /tmp/abc 是否存在都会输出 "exist",但只有不存在时才输出 "not exist"
管道命令 |
管道命令 的作用是把上一个命令的 标准输出(StdOut) 当做下一个命令的 标准输入(StdIn) 使用
注意1 管道命令 对 标准错误输出(StdErr) 是无效的,可以使用 2>&1 或者 &> 来使 StdErr 起效
注意2 管道命令 后 不可以接 ls cp mv 等命令,因为他们不接受 StdIn 的数据
数据的截取
cut 提取指定位置上的文件内容
cut [-cdf] [文件]
-c, --characters=<LIST> 以字符为单位,选择指定区间的内容(从 1 开始编号)
-d, --delimiter=<分隔符> 使用指定的字符作为分隔符,若不指定则使用 <Tab> 作为分隔符
-f, --fields=<LIST> 以片段为单位,选择指定区间的内容(从 1 开始编号)
若不指定文件,则用 StdIn 作为输入
-b, --bytes=<LIST> 以 Byte 为单位,选择指定区间的内容(从 1 开始编号)
-n 与 -b 连用,将 multibyte 字符当做一个 byte 来切割(比如 UTF-8 编码下的中文)
--complement 反选 -b -c -f 指定的部分
-s, --only-delimited 仅当该行有 分隔符 的时候才输出本行
--output-delimiter=<string> 指定输出时使用的分隔符,若不指定则使用原始分隔符输出
LIST 的几种形式
<num1>,<num2>... 罗列指定位置
<num1>- 从指定位置(包含 <num1>)罗列至最后
-<num2> 从头罗列至指定位置(包含 <num2>)
<num1>-<num2> 从 <num1>(包含) 罗列至 <num2>(包含)
eg.
[ep@epct ~]$ echo ${PATH} | cut -d ":" -f 3,5
# 返回 $PATH 里以 : 作为分隔的 第三段 以及 第五段
# 即 /usr/local/sbin:/home/eP/.local/bin
grep 获取指定字符所在行
grep [-acinv] [--color=auto] <匹配字符> [文件]
-a, --text 将 二进制 文件当成 普通 文本文件进行搜索
-c, --count 只显示找到的行数而不显示找到的行内容
-i, --ignore-case 忽略大小写区别
-n, --line-number 在每行前输出所在行号(行号从 1 开始)
-v, --invert-match 反选
--color=<never|always|auto> 根据 环境变量 GREP_COLOR 来设定匹配字符的颜色
# 注意 CentOS7 中, grep 是 grep --color=auto 的 alias
排序指令
sort [-fbMhnrtuk] [文件]
-f, --ignore-case 忽略大小写
-b, --ignore-leading-blanks 忽略行前空白字符
-M, --month-sort 月份排序: (unknown) < JAN < FEB < ... < DEC
-h, --human-numeric-sort 人类可读大小排序 (eg. 2K 1G)
-n, --numeric-sort 根据数字大小排序(默认为文本排序)
-r, --reverse 反转结果
-u, --unique
-t, --field-separator=<SEP> 使用指定的分隔符区分字段(默认使用任何空白字符作为分隔)
-k, --key=<KEYDEF> 指定特定的方法 按照特定的路程
-t -k 一般连用
-k 的通用语法
-k [[开始分区].[开始字符]],[[结束分区].[结束字符]]
eg.
-k 1.2,3.4
# 取 第 1 个字段 的 第 2 字符 至 第 3 个字段 的 第 4 个字符 作为 排序依据
将连续出现的相同行合并为一行,并计数
uniq [-ic]
-i 忽略大小写差异
-c 罗列连续行的数量
eg.
[ep@epct ~]$ last | cut -d ' ' -f 1 | sort | uniq -c
# 返回登录名以及登录次数
文档统计
wc [-clmw] [文件]
-c 计算文件 byte 数
-l 计算文件行数
-m 计算字符数
-w 计算词语数
-c 和 -m 会互相 override
当系统语言环境不识别 multibytes character 时, -c 和 -m 的数量为同一个
如果不加参数 则在同一行逐次显示 行数 单词数 字符数
分流重定向 -- 将 StdIn 输出至 指定文件 和 StdOut
tee [-a] [输出文件]
-a,--append 追加至文件尾
eg.
<命令1> | tee <输出文件> | <命令2>
将 <命令1> 的 StdOut 保存一份至文件,并接着作为 <命令2> 的 StdIn
标准输入流的转换字符( translate characters )
tr [-cCdst] <SET1> [SET2]
-c, -C, --complement 对 SET1 中没有的字符进行操作
-d, --delete 删除 SET1 中出现的字符
-s, --squeeze-repeats 若 标准输入 中有 连续多个字符 经 tr 转换后 对应同一个 SET2 中的字符,则只保留一个字符(去除连续重复)
-t, --truncate-set1 若 SET1 的长度大于 SET2,则从后删除 SET1 比 SET2 长的部分
tr 的算法(猜测)
将 SET1 中的字符顺次一一映射至 SET2 的字符上
若 SET1 的字符数多于 SET2,则超出部分一直使用 SET2 指定的最后一个字符
若 SET1 的字符数少于 SET2,则舍去 SET2 中超出的部分
若使用 -C,则一直使用 SET2 指定的最后一个字符作为替代字符
SET1 SET2 的语法格式
<1> 指定的字符
aceg 1357
<2> 指定的字符段-方括号与连字符
[a-z] [1-9]
<3> 其他用法
暂不表述
tr 的注意事项,tr 会操作特殊字符,所以在使用 -c 参数时要小心会转换 <Tab> 和 <LF>
标准输入 的 Tab-Space 转换
col [-hx]
-h, --tabs 将 空格 转换为 制表符
-x, --spaces 将 制表符 转换为 空格
注意,系统默认的 Tab 为 8 个 Space 的长度
对两个文件每行中的部分字符,若匹配成功则将两个文件的对应行合并为一行
join [-aeijtv12] <文件1> <文件2>
-a <FileNum> 将没有匹配成功的行也输出至文件尾部, <FileNum> 指代要合并的文件的编号
可以使用 -a 1 -a 2 将两个文件的不匹配项都输出
-e <FillString> 若在某个文件中某行缺少一个字段,则用 <FillString> 填充这个字段
-i, --ignore-case 忽略对比区的大小写差异
-t <Sep> 指定分割字符,默认使用空格
-j <CompareNum> 以 <文件1> <文件2> 的指定的相同位置的字段作为匹配依据
-v <FileNum> 同 -a,仅输出不匹配的项目
-1 <CompareNum> 设定 <文件1> 的匹配字段
-2 <CompareNum> 设定 <文件2> 的匹配字段
将两个文件具有同一个行序号的行粘贴在一起
paste [-d <Sep>] <文件1> <文件2>
-d 设置站在一起的两行中间的分隔符号
将 Tab 转换为 Space
expand [-t <num>] <file>
-t 指定一个 tab 转化为几个 space
文件的分割
split [-abCdl] [输入文件] [前缀]
-a, --suffix-length=<N> 后缀长度
--additional-suffix=<String> 后缀名
-b, --bytes=<Size> 规定分割文件的固定大小(允许人类可读大小)
-C, --line-bytes=<Size> 最大单行大小
-d, --numeric-suffixes[=<num>] 使用数字而非字母作为后缀,<num> 指定了开始的标号
-l, --lines=<num> 每个文件含有的行数
文件的合并
cat [文件序列]
将 StdIn 的内容逐次作为命令的参数
xargs [-0adEnp] <comand>
-0 将所有的字符作为普通字符对待包括空格和转译字符
-a <file>, --arg-file=<file> 从指定的文件中读取指令
-d <Sep>, --delimiter=<Sep> 自定义不同参数间的分隔符号
-E <String> 读取到 <String> 之后,发送 EOF 信号结束命令
-n <num>, --max-arges=<num> 单次执行 <command> 获取的最大参数数量
-p, --interactive 每次执行 <command> 前都询问用户是否执行
在管道命令中,可以使用 连字符 - 来表示,用 StdIn/StdOut 替代文件 作为 输入/输出