8.10 shell特殊符号cut命令
8.11 sort_wc_uniq命令
8.12 tee_tr_split命令
8.13 shell特殊符号下
shell特殊符号cut命令
1. 特殊符号:
* 任意个任意字符,
? 任意一个字符
# 注释字符
\ 脱义字符
| 管道符
$ 变量的前缀
!$ 正则里面表示行尾
; 多条命令写到一行,用;进行分割
~ 用户的家目录,正则表达式表示匹配符
& 放在命令后面,将命令放到后台
[] 指定字符中的一个
|| 或者,
[root@localhost spilt]# ls 2.txt || wc -l 3.txt #只要前面一条命令成功执行,那么后面的命令就不执行
2.txt
[root@localhost spilt]# ls 3.txt || wc -l 2.txt #如果前面的命令不成功,那么执行后面的命令
ls: 无法访问3.txt: 没有那个文件或目录
5398 2.txt
&& 并且
[root@localhost spilt]# ls 3.txt && wc -l 2.txt #只要前面一条命令执行不成功,那么后面的命令就不执行
ls: 无法访问3.txt: 没有那个文件或目录
[root@localhost spilt]# ls 2.txt && wc -l 3.txt #如果前面的命令成功执行,那么后面的命令才执行
2.txt
wc: 3.txt: 没有那个文件或目录
判断一个目录是否存在,如果不存在就创建,
[root@localhost spilt]# ls
2.txt
[root@localhost spilt]# [ -d linux ] || mkdir linux #[ -d linux ]判断一个目录是否存在,没有存在linux目录,执行后面命令创建linux目录
[root@localhost spilt]# ls
2.txt linux
[root@localhost spilt]# [ -d linux ] && mkdir linux #因为linux目录已经存在,前面的命令执行不成功,后面的命令不执行
mkdir: 无法创建目录"linux": 文件已存在
2. cut 分割, -d指定分隔符 -f指定第几段 -c 指定第几个字符
1. [root@localhost ~]# head -n2 /etc/passwd |cut -d ":" -f 1 #截取第一段
root
bin
2. [root@localhost ~]# head -n2 /etc/passwd |cut -d ":" -f 1,2,3 #截取第二段
root:x:0
bin:x:1
3. [root@localhost ~]# head -n2 /etc/passwd |cut -d ":" -f 1-5 #截取第一到第五段
root:x:0:0:root
bin:x:1:1:bin
4. [root@localhost ~]# head -n2 /etc/passwd |cut -c 3 #指定第三个字符
o
n
5. [root@localhost ~]# head -n2 /etc/passwd |cut -c 3-5 #指定第3-5个字符
ot:
n:x
二、 sort_wc_uniq命令
1. sort 排序,默认按照ASCII进行排序
[root@localhost ~]# head -n5 /etc/passwd |sort 查看/etc/passwd的前5行并进行排序
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
2.
sort -n 按照数字进行排序,字母或者特殊符号都会认为是0
[root@localhost ~]# sort -n 1.txt #对1.txt按照数字进行排序
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/
root:x:0:0:root:/root:/bin/bash
sbin/nologin
#$wsssq
3333dddddffgg
21312adm:x:3:4:adm:/var/adm:/sbin/nologin
23122
3. sort -r 反序进行排序
[root@localhost ~]# sort -nr 1.txt #反序进行排序,大的数字在前面
23122
21312adm:x:3:4:adm:/var/adm:/sbin/nologin
3333dddddffgg
#$wsssq
sbin/nologin
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
4.
wc -l 统计行数
[root@localhost ~]# wc -l 1.txt
9 1.txt
5. wc -m 统计字符数,$每一行的换行符也算一个字符
[root@localhost ~]# wc -m 1.txt
217 1.txt
6. wc -w 统计词数,以空白字符作为分隔符号
[root@localhost ~]# wc -w 1.txt
9 1.txt
7.uniq 去重复,但是需要先进行排序
[root@localhost ~]# uniq 33.txt #单独使用uniq相同的字符相邻才有用,所以要先进行排序
121312
111
2222
333
2222
dddd
333121312
111
2222
333
2222
dddd
333121312
1113331213123
[root@localhost ~]# sort 33.txt|uniq #先排序再去重
111
1113331213123
121312
2222
333
333121312
dddd
8. uniq -c 统计重复的次数
[root@localhost ~]# sort 33.txt |uniq -c
2 111
1 1113331213123
1 121312
4 2222
2 333
2 333121312
2 dddd
三、tee_tr_split命令
1. tee 和>的功能类似,重定向还可以将结果打印在屏幕上
tee -a 和>>功能类似,追加重定向
[root@localhost ~]# sort 33.txt |uniq -c |tee ww.txt 对33.txt进行排序去重,并将结果重定向到ww.txt
2 111
1 1113331213123
1 121312
4 2222
2 333
2 333121312
2 dddd
2. tr 替换字符
[root@localhost ~]# echo "rainlinux" |tr '[rl]' '[RL]' #将rl小写替换为大写
RainLinux
[root@localhost ~]# echo "rainlinux" |tr '[a-z]' '[A-Z]' #将所有的字符替换为大写
RAINLINUX
3. split -b 切割文件,按照大小进行切割
[root@localhost spilt]# split -b 1M rr.txt #按照1M的大小切割文件rr.txt
[root@localhost spilt]# ls
rr.txt xaa xab xac xad xae xaf xag xah
[root@localhost spilt]# split -b 100k 2.txt hh- #指定切割后文件的前缀名,hh-
[root@localhost spilt]# ls
2.txt hh-aa hh-ab hh-ac
4. split -l
切割文件,按照行数进行切割
[root@localhost spilt]# split -l 1000 2.txt # 将2.txt没1000行分割为1个文件
[root@localhost spilt]# ls
2.txt xaa xab xac xad xae xaf
[root@localhost spilt]# wc -l * #共5398行,分割为6个文件
5398 2.txt
1000 xaa
1000 xab
1000 xac
1000 xad
1000 xae
398 xaf
10796 总用量
1. 设置环境变量 HISTSIZE , 使其能够保存10000条命令历史。
vim /etc/profile #打开配置文件
HISTSIZE=10000 #在配置文件里面找到这一行,将数值更改为10000
source /etc/profile #当更改profile文件后,需要source下生效
2. 为什么如果这样设置PS1 (PS1="[\u@\h \W]\$ ") 显示的结果和我们预想的不一样,那要如何设置才能恢复原来默认的?
因为变量的值含有特殊字符$,不能使用”“,要使用单引号‘’,改成PS1='[\u@\h \W]\$ '即可
3. 想办法把当前目录下的文件的文件名中的小写字母全部替换为大写字母。
ls -a |tr "[a-z]" "[A-Z]"
4. 使用sort以":"为分隔符,对/etc/passwd文件的第5段排序。
sort -t ":" -k 5 /etc/passwd
5. 使用cut以":"为分隔符,截出/etc/passwd的第三段字符。
cut -d ":" -f 3 /etc/passwd
6. 简述这几个文件的作用: /etc/profile, /etc/bashrc, .bashrc, .bash_profile.
/etc/profile 用户环境变量,交互,登陆才执行
/etc/bashrc 用户不用登陆,执行shell就生效
.bash_profile每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,它设置一些环境变量,然后执行用户的.bashrc文件.
.bashrc:该文件包含专用于某个用户的bash shell的bash信息,当该用户登录时以及每次打开新的shell时,该文件被读取.
7. export 的作用是什么?
用于设置或显示环境变量,
8. linux下自定义变量要符合什么样的规则呢?
变量名规则:字母,数字,下划线,首字母不能是数字
变量的值有特殊的符号时需要用单引号括起来,一般不要使用双引号
当变量比较复杂的时候可以用多个双引号引起来
9. 如何把要运行的命令丢到后台跑?又如何把后台跑的进程给调到前台?
bg 将任务放到后台并运行 ,或者在命令的后面加上&
fg 将任务回到前台并运行
10. 列出当前目录下以"test"开头的文件和目录。
ls -d test*
11. 如何把一个命令的输出内容不仅打印到屏幕上而且还可以重定向到一个文件内?
使用tee命令
12. 假如有个命令很长,我们如何使用一个简单的字符串代替这个复杂的命令呢?请举例说明。
alias viens33='vi /etc/sysconfig/network-scripts/ifcfg-ens33' #设置一个别名
13. 我如何实现这样的功能,把一条命令丢到后台运行,而且把其正确输出和错误输出同时重定向到一个文件内?
ping
www.baidu.com
&> ff.txt &
14. 如何按照大小(假如按照10M)分隔一个大文件,又如何按照行数(假如10000行)分隔
split -b 10M test.txt 按照大小分隔
split -l 10000 test.txt 按照行数分隔
15. 做实验,搞明白 ; && || 这三个符号的含义。
; 两条命令都会执行
[root@localhost ~]# ls -l dd.txt;wc -l a.txt
-rw-r--r--. 1 root root 146 1月 12 18:25 dd.txt
wc: a.txt: 没有那个文件或目录
|| 或者
[root@localhost spilt]# ls 2.txt || wc -l 3.txt #只要前面一条命令成功执行,那么后面的命令就不执行
2.txt
[root@localhost spilt]# ls 3.txt || wc -l 2.txt #如果前面的命令不成功,那么执行后面的命令
ls: 无法访问3.txt: 没有那个文件或目录
5398 2.txt
&& 并且
[root@localhost spilt]# ls 3.txt && wc -l 2.txt #只要前面一条命令执行不成功,那么后面的命令就不执行
ls: 无法访问3.txt: 没有那个文件或目录
[root@localhost spilt]# ls 2.txt && wc -l 3.txt #如果前面的命令成功执行,那么后面的命令才执行
2.txt
wc: 3.txt: 没有那个文件或目录
16. 如果只想让某个用户使用某个变量如何做?
可以在那个用户的.bashrc中添加这个变量,
17. 使用哪个命令会把系统当中所有的变量以及当前用户定义的自定义变量列出来?
使用set命令即可