命运要你成长的时候,总会安排一些让你不顺心的人或事刺激你;
等你的身体出了什么毛病,你就会意识到什么烦心事都是屁,都是吃饱了撑的,都是闲的,健康活着比什么都重要。
命令目录:
- [文件查看]: [cat] [tac] [rev] [more][less]
- [按行截取]: [head] [tail]
- [转化内容]: [tr]
- [按列操作]: [cut] [paste]
- [分析文本]: [wc] [sort] [uniq] [diff、patch]
- [按关键字过滤]: [grep]
1. 文件查看
cat
查看文件,从第一行到最后一行全部显示。
参数:
- -E: 显示行结束符$
- -A:显示不可打印字符,通常查看脚本是否有多加空格tab回车之类的。
- -n:对显示出的每一行进行编号
- -s:显示行号,压缩连续的空行,只显示一行空行
- -b:空行不加行号,等同于
nl
命令
示例:
[root❄centos7 app]☭ cat catfile
AAA BBB
CCC DDD
EEE
GGG
HHH
[root❄centos7 app]☭ cat -A catfile
AAA^IBBB$
CCC DDD$
EEE$
$
GGG$
$
$
HHH$
[root❄centos7 app]☭ cat -n catfile
1 AAA BBB
2 CCC DDD
3 EEE
4
5 GGG
6
7
8 HHH
[root❄centos7 app]☭ cat -b catfile
1 AAA BBB
2 CCC DDD
3 EEE
4 GGG
5 HHH
[root❄centos7 app]☭ cat -s catfile
AAA BBB
CCC DDD
EEE
GGG
HHH
tac
从后往前显示文件,和cat相反。
示例:
[root❄centos7 app]☭ tac catfile
HHH
GGG
EEE
CCC DDD
AAA BBB
rev
reverse lines水平反转每一行里的字母。
示例1,水平翻转文件:
[root❄centos7 app]☭ rev catfile
BBB AAA
DDD CCC
EEE
GGG
HHH
示例2,倒序+水平翻转文件:
[root❄centos7 app]☭ tac catfile | rev
HHH
GGG
EEE
DDD CCC
BBB AAA
more
分页显示,显示到最后会退出。
空格或者f下一页
b上一页(管道后跟more无法上一页)
less
分页显示,显示到最后也不会退出,要按q退出;
翻屏操作:
键盘按键 | 效果 |
---|---|
空格键 | 向下滚动一屏 |
b | 向上滚动一屏 |
j | 向下移动一行 |
k或回车 | 向上移动一行 |
gg | 跳转至第一行 |
5g | 跳转到第5行 |
G | 跳转到最后一行 |
q | 退出 |
文本搜索:
键盘按键 | 效果 |
---|---|
/keyword | 向下查找,不区分大小写 |
?keyword | 向上查找,不区分大小写 |
n | 查找下一个,与查找方向相同 |
N | 查找上一个,与查找方向相反 |
2. 按行截取
head
取文件头部的行,默认头10行。
参数:
-c NUM
:显示几个字符-n NUM
:显示几行
# 取随机数里,数字或字母的字符,取前20个字符,可以用来做随机密码。
cat /dev/urandom | tr -dc "0-9a-zA-Z" | head -c 20
tail
显示文件尾部的行,默认最后10行。
参数:
-c NUM:只显示倒数几个字符。
-n NUM:示倒数几行。
-f:follow,跟踪这个文件的变动,用来看日志比较多
例子:
tail -n0 -f /var/log/messages &`
-n0只显示新增加的内容,命令最后加一个&,表示放在后台运行,可以去运行其他命令不受影响。当日志变动的时候,会在前台打印出一条,按回车可以继续运行其他命令。
3. 转化内容
tr
tr [OPTION]... SET1 [SET2]
把输入的数据当中的字符,凡是在SET1
定义范围内出现的,通通对位转换为SET2
出现的字符
参数:
- tr SET1 SET2 < /path/from/somefile`对位转化SET1中的字符为SET2中的字符
- tr -d SET1 < /path/from/somefile`删除指定集合里出现的字符
- tr -s "\n" /path/from/somefile`把指定的连续的字符以一个字符表示,压缩。
- tr -c Complement ,取字符集的补集,通常与其他参数结合使用,例如`-dc
[root❄centos7 ~]☭ tr 'a-z' 'A-Z'
aabbcc33
AABBCC33
^C
[root❄centos7 ~]☭ tr 'a-z' 'A-Z' </etc/issue
\S
KERNEL \R ON AN \M
[root❄centos7 ~]☭ tr 'a-z' 'A-Z' < /etc/issue > /app/issue2
[root❄centos7 ~]☭ cat /app/issue2
\S
KERNEL \R ON AN \M
tips:如果是输入后再输出到同一个文件,就会清空这个文件,所以最好不要这么用,下面是一个错误示范:
[root❄centos7 ~]☭ cd /app/
[root❄centos7 app]☭ cp issue2 issue3
[root❄centos7 app]☭ tr 'a-z' 'A-Z' < issue3 >issue3
[root❄centos7 app]☭ cat issue3
[root❄centos7 app]☭
追加是可以的,在原有文件基础上再追加一段:
[root❄centos7 app]☭ cat issue2
\S
KERNEL \R ON AN \M
[root❄centos7 app]☭ tr 'A-Z' 'a-z' < issue2 >> issue2
[root❄centos7 app]☭ cat issue2
\S
KERNEL \R ON AN \M
\s
kernel \r on an \m
dc结合使用:
[root❄centos7 app]☭ echo {a..z} >f1
[root❄centos7 app]☭ cat f1
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root❄centos7 app]☭ tr -d 'f-n' <f1
a b c d e o p q r s t u v w x y z
[root❄centos7 app]☭ cat f1
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root❄centos7 app]☭ tr -dc 'f-n' < f1
fghijklmn[root❄centos7 app]☭
4. 按列操作
cut
cut可以实现分割每一行,并且指定输出列的字段。
- -d DELIMITER:指定分隔符(delimiter)
- -f FIELDS:取指定列字段(fileds)
示例1:
# 以冒号作为分隔符,取1到3、7的字段
cut -d: -f1-3,7 /etc/passwd
# 结果
root:x:0:/bin/bash
LongDream:x:1000:/bin/bash
yu:x:1001:/bin/bash
alice:x:1002:/bin/bash
tom:x:1003:/bin/bash
示例2:
# 取磁盘利用率,先tr压缩空格为一个空格,然后以空格作为分隔符,取第五个字段
df |tr -s " "| cut -d" " -f5
# 结果
Use%
5%
0%
0%
1%
0%
1%
22%
0%
paste
把多个文件的多行进行合并,逐行进行合并。
参数:
-d指定分隔符,默认是tab
-s把每个文件里的多行合成一行,每个文件一行。
示例:
[root❄centos7 app]☭ cat file1
name
aaa
bbb
ccc
[root❄centos7 app]☭ cat file2
age
18
20
22
[root❄centos7 app]☭ paste file1 file2
name age
aaa 18
bbb 20
ccc 22
[root❄centos7 app]☭ paste -d: file1 file2
name:age
aaa:18
bbb:20
ccc:22
[root❄centos7 app]☭ paste -s file1 file2
name aaa bbb ccc
age 18 20 22
5. 分析文本
wc
直接运行原wc命令:输出文件中的行数、单词数、字节数
参数:
- -c:输出字节数
- -m:输出字符数
- -l :输出行数
- -L:输出最长的行的长度。
- -w: 输出单词统计数。
[dell@Centos7 data]$ echo "how old are you?" | wc
1 4 17
# 1行4个单词17个字符;
sort
排序,默认是按照字符的大小来排列
-t
:指定分隔符-k
:以哪一个为分割-n
:按数字大小排列,从小到大-r
:反向,从打到小-u
:删除重复的行
示例1:
# 以冒号分割,取第三列UID,nr表示按照数值大小倒序(由大到小)排列。
sort -t: -k3 -nr /etc/passwd
# 先cut只留第一列用户名和第三列UID
cut -d: -f1,3 /etc/passwd | sort -t: -k2 -nr
示例2:
# 取分区使用率最大值
df |tr -s " " "%"|cut -d% -f5|sort -nr|head -n1
uniq
唯一,从输入中删除前后相接的重复的行
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
常和sort 命令一起配合使用,示例:
# 把用户名列表进行排序(重复的会在相邻的行),然后统计重复用户出现的次数:
sort userlist.txt | uniq -c
# 登录用户的登录次数:
last | cut -d ' ' -f1|sort| uniq -c |sort -nr
diff、patch——手动实现版本控制的工具
diff比较两个文件的区别
# 比较两个文件的区别,发现第5行有区别
diff foo.conf-broken foo.conf-works
5c5
< use_widgets = no
---
> use_widgets = yes
patch可以用diff生成的patch来修复另一个文件。
diff -u foo.conf-broken foo.conf-works > foo.patch #把差异写到foo.patch补丁里
cp foo.conf-broken foo.conf-broken.bak #备份一下
patch -b foo.conf-broken foo.patch # 从差异的补丁进行恢复
6. 按关键字过滤
grep
文本过滤工具
不带参数普通用法:
grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
带参数:
- -v:显示不被pattern匹配到的行
- -i:忽略字符大小写
- -n:显示匹配的行号
- -c:统计匹配的行数
- -o:仅显示匹配到的字符串
- -q:静默模式,不输出任何信息(quiet,可以结合
echo $?
状态码使用)- -A NUM after, 包含匹配行的后NUM行
- -B NUM:before, 包含匹配行的前NUM行
- -C NUM context, 包含匹配行的前后各NUM行
- -e: 实现多个选项间的逻辑or关系
- -w匹配整个单词(字母、下划线、数字汉字,这几个连在一起算一个单词)
- -E使用ERE
- -F相当于fgrep,不支持正则表达式
参考书籍:关于grep的各个参数的具体用法,可以看《Linux Shell 脚本攻略(第2版)》4.3章节,有详细说明,这里不做赘述。
例子:
# 扫描172.16.252。0段的机器,如果主机是up状态(Host is up)的,显示之前一行(-B1),前一行有ip地址,然后grep for是因为只有有ip的那行有for,然后以空格为分隔符,取第五个,就是ip地址。
nmap -v -sP 172.17.252.0/24 |grep -B1 "Host is up."|grep for|cut -d" " -f5
网友评论