shell特性回顾
1.echo linux打印命令
参数
- -n 取消输出后行末的换行符号
- -e 支持反斜线控制的字符转换 \n \t !
控制字符 | 作 用 |
---|---|
\ | 输出\本身 ! |
\a | 输出警告音 |
\b | 退格键,也就是向左删除键 |
\c | 取消输出行末的换行符。和“-n”选项一致 |
\e | Esc键向右删除键 |
\f | 换页符 |
\n | 换行符 |
\r | 字符替换 |
\t | 制表符,也就是Tab键 |
\v | 垂直制表符 |
\0nnn | 按照八进制 ASCII 码表输出字符。其中 0 为数字 0,nnn 是三位八进制数 eg:141 这个八制数在 ASCII 码中代表小写的"a",其他的以此类推echo -e "\0141\t\0142" |
\xhh | 按照十六进制 ASCLL 码表输出字符。其中 hh 是两位十六进制数 [root@localhost ~]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66" a b c d e f #如果按照十六进制ASCII码同样可以输出 |
可以输出带颜色的字体:
-
格式:echo -e "\e[字体控制;字体颜色或背景色 字符串内容 \e[0m"
-
\e[表示控制开始,\e[0m表示控制结束
-
字体控制选项:1表示高亮,4表示下划线,5颜色闪烁
-
颜色如下:字颜色:30-37 , 背景色:40-47
-
解释一下这个命令:\e[字体控制选项;字体背景颜色;文字颜色m 字符串 \e[0m 代表颜色输出结束文字颜色:30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,36m=青色,37m=白色。字体背景色:40m=黑色,41m=红色,42m=绿色,43m=黄色,44m=蓝色,45m=洋红,46m=青色,47m=白色。字体控制选项:1表示高亮,4表示下划线,5颜色闪烁
[root@server ~]# vim color.sh
echo -e "\e[30m 黑色字\e[0m"
echo -e "\e[1;31m 紅色字\e[0m"
echo -e "\e[32m 綠色字\e[0m"
echo -e "\e[33m 黃色字\e[0m"
echo -e "\e[34m 藍色字\e[0m"
echo -e "\e[35m 紫色字\e[0m"
echo -e "\e[36m 天藍字\e[0m"
echo -e "\e[37m 白色字\e[0m"
echo -e "\e[40;37m 黑底白字\e[0m"
echo -e "\e[41;37m 紅底白字\e[0m"
echo -e "\e[42;37m 綠底白字\e[0m"
echo -e "\e[43;37m 黃底白字\e[0m"
echo -e "\e[44;37m 藍底白字\e[0m"
echo -e "\e[45;37m 紫底白字\e[0m"
echo -e "\e[46;37m 天藍底白字\e[0m"
echo -e "\e[47;30m 白底黑字\e[0m"[root@server ~]# bash color.sh
注意:三个顺序没有要求,但只能加一个m,且m加在最后一个选项,中间用;隔开注意:三个顺序没有要求,但只能加一个m,且m加在最后一个选项,中间用;隔开
2.printf
- printf 命令模仿 C 程序库(library)里的 printf() 程序。
- printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
- printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。
- 默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
printf 命令的语法:
printf format-string [arguments...]
printf 格式控制字符串 参数列表
参数说明:
-
format-string: 为格式控制字符串%10s %c %d %f
-
arguments: 为参数列表。
实例
[root@server ~]# echo "Hello, Shell"
[root@server ~]# printf "Hello, Shell\n"
[root@server ~]# printf "%d %s\n" 1 "abc"
[root@server ~]# printf '%d %s\n' 1 "abc" # 单引号双引号效果一样
[root@server ~]# printf %s abcdef # 没有双引号也可输出,没有\n会续连下一个提示符
[root@server ~]# printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
接下来,我来用一个脚本来体现 printf 的强大功能:
实例
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
执行脚本,输出结果如下所示:
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
- %s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
- %-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
- %-4.2f 指格式化为小数,其中 .2 指保留2位小数,4是总长度(如果不满4补空格,超出也全部显示)
实例
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j# 如果没有 arguments(参数),那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"
执行脚本,输出结果如下所示:
abcdefabc
defa b c
d e f
g h i
j and 0
3、命令执行顺序
-
顺序执行: ;
[root@server ~]# date ; ls -l /etc/passwd
-
前面命令执行不成功,后面的命令不执行: &&
[root@server ~]#id haha && userdel -r haha[root@server ~]# mkdir /mnt/iso && mount /dev/sr0 /mnt/iso
-
前面命令成功,后面就不执行,如果前面不成功后面就执行: ||
[root@server ~]# mkdir tt || ls /
[root@server ~]# mkdir tt || ls / # 可以再次执行
- ! 非
- &后台运行
4、命令与文件名补全:tab
命令别名
格式:
-
alias 别名=原命令
例:
[root@server ~]# alias hi=history
[root@server ~]# hi
注意
-
别名的优先级比命令高,命令执行时的顺序如下:
第一顺位:执行用绝对路径或相对路径执行的命令。
第二顺位:执行别名。
第三顺位:执行 Bash 的内部命令。
第四顺位:执行按照 $PATH 环境变量定义的目录查找顺序找到的第一个命令。
-
为了让这个别名永久生效,可以把别名写入环境变量配置文件“~/.bashrc”。
[root@server ~]# cat ~/.bashrc # 在最下面增加
5、管道符
-
符号:| ,当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道
-
面试题1:提取系统网卡的IP地址信息
[root@server ~]# ip a | grep ens32 | grep inet | cut -d / -f1 | tr -s " " | cut -d " " -f3
# 显示ip信息 | 过滤包含ens32行 | 过滤包含inet行 | 以/作为分隔符取出第1部分 | 将多个空格压缩为1个空格 | 以空格为分隔符取出第3部分
-
面试题2:显示内存的剩余数量
[root@server ~]# free -h | grep Mem | tr -s " " | cut -d " " -f4
106Mi
[root@server ~]# free -h | grep Mem | awk '{print $4}' # 使用awk截取第4列
106Mi
6、exit退出程序
-
作用:终止Shell程序的执行
-
格式:exit 状态码
-
状态码:该参数是一个整数值,其取值范围为0~255
-
注意:Shell程序的退出状态码储存在系统变量$?中,因此,用户可以通过该变量取得Shell程序返回给父进程的退出状态码
-
常见状态码:
0----------------命令运行成功1----------------通知未知错误2----------------误用shell命令126--------------命令不可执行127--------------没有找到命令128--------------无效退出参数128+x------------linux信号x的严重错误130--------------命令通过Ctrl+C终止255--------------退出状态码越界
-
演示在不同的情况下,程序返回不同的状态码
[root@server ~]# echo "china"
china
[root@server ~]# echo $?
0
[root@server ~]# ehco "china"
bash: ehco: command not found...
Similar command is: 'echo'
[root@server ~]# echo $?
127
7、通配符 (文件名通用匹配) 正则符 (文件内容,标准输出结果)
通配符是系统命令使用,一般用来匹配文件名或者什么的用在系统命令中。而正则表达式是操作字符串,以行尾单位来匹配字符串使用的
? 匹配一个任意字符
`*` 匹配 0 个或任意多个任意字符,也就是可以匹配任何内容
[a1b2] 匹配中括号中任意一个字符。
[a-z] 匹配中括号中任意一个字符, -代表一个范围。
[^a-z] 逻辑非,表示匹配不是中括号内的一个字符。
[a-z] [0-9] [a-zA-Z] [^0-9a-zA-Z]
{1,2,3,4}
mkdir {1,2,3,4}~ 代表当前用户的主目录
. 代表当前目录
.. 代表当前目录的父目录
- 部分用法代表一个范围
[[:class:]]:匹配一个属于指定字符类中的字符,[:class:]表示一种字符类,比如数字、大小写字母等。
常用字符类:
[:alnum:] :匹配任意一个字母或者数字 ,传统UNIX写法: a-zA-Z0-9
[:alpha:] :匹配任意一个字母,传统UNIX写法: a-zA-Z [:alpha:]
[:digit:] :匹配任意一个数字,传统UNIX写法: 0-9
[:lower:] : 匹配任意一个小写字母,传统UNIX写法: a-z
[:upper:] : 匹配任意一个大写字母,传统UNIX写法:A-Z
[:space:] :空白字符
[:punct:] : 标点符号
注意事项:在使用专属字符集的时候,字符集之外还需要用 [ ] 来包含住,否则专用字符集不会生效,例
如 [[:space:]]
[root@HAHA ~]# grep '[[:upper:]]' a
AAA
BBB
CCC
通配符常用语法:
1、匹配任意长度的任意字符,就是说“什么都可以”。
ll * 2、?:与任何单个字符匹配。
ll myfile?
3、[ ]:与?相似,可以匹配一个括号内的字符,也可以用“-”进行范围指定。
myfile[12] #将与myfile1和myfile2匹配
/etc/[0-9]
#将列出 /etc 中以数字开头的所有文件。
ls /tmp/[A-Za-z] #将列出/tmp中以大写字母或小写字母开头的所有文件。 4、[!]:括号内的“!”代表非的意思,即不与括弧中的字符匹配。
rm myfile[!9] #删除除了myfile9之外的名为myfile加一个字符的所有文件 5、{}生成序列
touch file{1..9}.txt
#当前路径生成file1.txt~file9.txt。{a..f}代表a-f,不连续的使用,分 隔,比如f{1,3,5}.txt 6、使用{}备份
cp file1.txt{,.bak} #将fiel1.txt复制一份叫file1.txt.bak
cp file{2,22}.txt #复制file2.txt为file22.txt
示例:
1、列出/etc/目录中不是以字母a到n开头的,并且以.conf结尾的文件
ls /etc/[!a-n]*.conf 2、列出/etc/目录中以字母a到n开头的,并且以.conf结尾的文件
ls /etc/[a-n]*.conf 3、列出/bin/下以 c或k开头的文件名
ls /bin/[ck]*
1、创建用户haha且用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息;
useradd haha && echo "haha" | passwd --stdin haha > /dev/null2、每个用户添加完成后,都要显示用户某某已经成功添加;
useradd user1 && echo "user1已经成功添加"
如果用户存在,就显示用户已存在;否则,就添加此用户;
(id user1 &>/dev/null && echo "user已存在") || useradd user1
如果用户不存在,就添加;否则,显示其已经存在;
!id user1 &>/dev/null && (useradd user1;echo user1 |passwd --stdin user1) || echo "用户已存在"
!id user1 &>/dev/null && (useradd user1 && echo user1 |passwd --stdin user1) || echo "用户已存在"
! id user1 && useradd user1 || echo "user1 exists."
如果用户不存在,添加并且给密码;否则,显示其已经存在;
练习,写一个脚本,完成以下要求:
1、添加1个用户user1;但要先判断用户是否存在,不存在而后再添加;
2、最后显示当前系统上共有多少个用户;
wc -l /etc/passwd
wc -l /etc/passwd | cut -d " " -f 1 (只显示数量,不显示文件名)
echo 当前系统一共有`wc -l /etc/passwd | cut -d " " -f 1`个用户
或者
echo "当前系统一共有`wc -l /etc/passwd | cut -d ' ' -f 1`个用户"` ` 反引号执行中间命令
' ' 单引号,强引用符
" " 双引号,弱引用符
练习:写一个脚本
1、在当前主机编写脚本文件/history_max.sh显示主机执行频率最高的前5个命令.
history -wvim ~/.bash_historysort ~/.bash_history | uniq -c | sort -n
2、判断主机是否存在rhel用户如果存在则设置密码为redhat,提示用户存在密码创建成功,如果不存在则创建用户并设置密码,提示用已成功创建。
id rhel &>/dev/null && (echo "redhat" | passwd --stdin rhel && echo 密码设置成功 ) || useradd rhel && (echo redhat | passwd --stdin rhel && echo 用户创建密码设置成功)
文件内容查看
cat 命令
-
作用:查看文件内容,适合数据量较少
-
格式:cat -参数 文件名
-
参数:
-
-n:显示行号,加上
-
-b:文件中所有非空行增加行号,编号从1开始
-
-
例1:
[root@server ~]# cat /etc/passwd
[root@server ~]# cat -n /etc/passwd
-
例2:将显示结果重定向输出到另一个文件中
[root@server ~]# touch pwd.txt
[root@server ~]# cat /etc/passwd > pwd.txt # > 为重定向符
[root@server ~]# cat pwd.txt
-
合并文件:
[root@node1 ~]# touch t1.txt t2.txt t3.txt
[root@node1 ~]# echo "hello" > t1.txt
[root@node1 ~]# echo "world" > t2.txt
[root@node1 ~]# cat t1.txt t2.txt > t3.txt
[root@node1 ~]# cat t3.txt
hello
world
-
注意:tac命令是倒置输出文件内容
tac
-
作用:倒叙访问文件内容
-
格式:tac 参数 文件名
-
例如: tac /etc/passwd
more 命令
-
作用:翻页查看文件内容,适合内容较多的文件查看
-
格式:more 文件名
-
注意:使用回车则一行一行查看,使用空格则整页查看,点击q键退出查看
[root@server ~]# more -sp /etc/passwd # -sp 减少空白行,先清屏后输出
less命令
-
作用:同more命令
-
格式:less 文件名
-
注意:可以使用上下键进行浏览,点击q退出浏览
head命令
-
作用: 查看文档前n行的内容
-
格式:head -数字 文件名
-
例:
[root@server ~]# head /etc/passwd # 默认查看文档前10行内容
[root@server ~]# head -5 /etc/passwd
tail命令
-
作用:查看文档后n行内容
-
格式:tail -参数 文件名
-
参数
-
-数字:查看倒数行数
-
-f:动态刷新, 实时显示日志文件并且能动态更新
-
-
例:
[root@server ~]# tail /etc/passwd # 默认查看文档后10行内容
[root@server ~]# tail -1 /etc/passwd
[root@server ~]# tail -f /var/log/messages # 监视日志
[root@server ~]# head -6 /etc/passwd | tail -1 # 查看第6行
文件中字符替换显示-tr
作用
-
tr 指令从标准输入读取数据,经过替换或者删除后,将结果输出到标准输出
格式
tr -参数 替换内容 新内容
参数
-
-c :反选设定字符,符合 “替换内容” 的部份不做处理,不符合的剩余部份才进行转换
-
-d :删除指令字符
-
-s :缩减连续重复的字符成指定的单个字符
示例
-
小写字母全部转换成大写字母
[root@server ~]# cat /etc/passwd | tr a-z A-Z
-
提取IP地址
[root@server ~]# ip a | grep ens160 | grep inet | cut -d / -f1 | tr -s ' ' | cut -d ' ' -f3
文本内容统计wc
作用
-
wc命令用于统计指定文本文件的行数、字数或字节数
格式
wc -参数 文件名
参数
选项 | 作用 |
---|---|
-l | 只显示行数 |
-w | 只显示单词数 |
-c | 只显示字节数 |
示例
-
统计所有
[root@server ~]# wc /etc/passwd37 88 2083 /etc/passwd
# 行数 单词数 字节数
-
配合管道符计算
[root@server ~]# ll / | wc -l # 文件数
[root@server ~]# grep "/bin/bash" /etc/passwd | wc -l
[root@server ~]# cat /etc/passwd | cut -d ":" -f1 | wc -l
复制、移动文件cp,mv
复制文件或目录
格式
cp -参数 源文件 目标文件
参数
选项 | 功能 |
---|---|
-a | 通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录 |
-d | 拷贝时保留链接 |
-f | 在覆盖已经存在的目标文件时不提示 |
-i | 在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝 |
-p | 除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中 |
-r | 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名 |
示例
[root@server ~]# cd ~
[root@server ~]# touch t1.txt
[root@server ~]# cp t1.txt /
[root@server ~]# touch t2.txt
[root@server ~]# cp t2.txt /t3.txt # 另存为
[root@server ~]# cp p1 / # 报错,目录需加-r
[root@server ~]# cp -r p1 /
[root@server ~]# cp -r p2 /p3 # 目录另存为
[root@server ~]# mkdir -p /t1/t2/t3
[root@server ~]# cp -a /t1 ~
[root@server ~]# ls
公共 模板 视频 图片 文档 下载 音乐 桌面 anaconda-ks.cfg t1
[root@server ~]# cd t1
[root@server t1]# ls
t2
[root@server t1]# cd t2
[root@server t2]# ls
t3
[root@server t2]# ll
总用量 0
drwxr-xr-x 2 root root 6 4月 25 10:39 t3
移动文件或目录mv
作用
-
mv命令用于剪切或重命名文件
格式
mv [选项] 源文件名称 目标文件名称
注意
-
剪切操作不同于复制操作,因为它会把源文件删除掉,只保留剪切后的文件。
-
如果在同一个目录中将某个文件剪切后还粘贴到当前目录下,其实本质就是对文件进行了重命名操作。
[root@server ~]# touch t3.txt
[root@server ~]# mv t3.txt /etc #源为文件,目标为目录 ,为移动
[root@server ~]# touch t3.txt
[root@server ~]# mv t3.txt t4.txt # 源为文件 ,目标为文件,位置不变,为改名
tar归档命令
格式
tar -参数 [args]……
参数
常用参数
选项 | 功能 |
---|---|
-c | 创建.tar格式的包文件 |
-x | 释放.tar格式的包文件 |
-t | 查看包中的文件列表 |
必选参数
选项 | 功能 |
---|---|
-f | 用于指定打包文件名。 当与-c选项一起使用时,创建的tar包文件使用该选项指定的文件名 当与-x选项一起使用时,则释放该选项指定的tar包文件 |
辅助参数
选项 | 功能 |
---|---|
-v | 表示在命令执行时显示详细的提示信息 |
-p | 打包时保留文件及目录的权限 |
z | 调用gzip程序,以gzip格式压缩或解压缩文件(.tar.gz) |
-j | 调用bzip2程序,以bzip2格式压缩或解压缩文件(.tar.bz2) |
-J | 使用xz压缩或解压缩文件(.tar.xz),xz的压缩率通常比bzip2更高 |
-C(大写字母C) | 和-x选项一起使用,表示释放包时指定释放的目标路径 |
额外参数
# 打包时排除某个文件
tar cf 文件名.tar --exclude=路径/文件 路径
注:此处的路径前后需要保持保持一致,统一使用绝对路径或者相对路径
格式
打包
-
作用:创建(非压缩的)打包文件,将指定的一个或多个文件或目录备份生成为一个指定的包文件
tar cvf/cfv/-cvf 文件名.tar 要打包的目录或文件名
-
列出包文件中的文件列表
tar t[v]f 包文件名`
打包压缩
-
作用:为节省存储空间,通常需要生成压缩格式的tar包文件,tar命令支持三种不同的压缩方式
tar czf/-czf 文件名.tar.gz 要打包压缩的目录或文件名……
tar cjf/-cjf 文件名.tar.bz2 要打包压缩的目录或文件名……
tar cJf/-cJf 文件名.tar.xz 要打包压缩的目录或文件名……
-
提取包文件到指定目录
tar xf/-xf/-xzf 文件名.tar.gz [-C 目标路径]
tar xf/-xf/-xjf 文件名.tar.bz2 [-C 目标路径]
tar xf/-xf/-xJf 文件名.tar.xz [-C 目标路径]
示例
-
将/etc下所有内容打包压缩到/root目录中
[root@server ~]# tar -cvf taretc.tar.gz /etc
-
解压缩
[root@server ~]# mkdir temp
[root@server ~]# mv taretc.tar.gz temp
[root@server ~]# cd temp
[root@server temp]#
[root@server temp]# tar -xvf taretc.tar.gz
-
注意:参数中-c 与 -x 不能同时使用
文件内容过滤显示—grep
作用:
-
在指定的普通文件中查找并显示含有指定字符串的行,也可与管道符一起使用
格式
grep -参数 查找条件 文件名
参数
选项 | 说明 |
---|---|
-o | 只把查找的关键字显示出来 |
-c | 仅显示找到的行数 |
-i | 忽略大小写 |
-n | 显示行号 |
-v | 反向选择——仅列出没有“关键词”的行 |
-A | -A 2 搜索时显示匹配到的那一行以及下2行 |
-B | -B 2 搜索时显示匹配到的那一行以及上2行 |
-C | -C 2 搜索时显示匹配到的那一行以及上下2行 |
-q | 以安静模式执行查找,找到匹配字符串时仅返回表示找到的退出状态码(找到0,未找到1),不输出匹配行内容 |
-w | 以单词模式查找,只会将完整且单独作为一个单词存在的字符串视为匹配对象 |
/etc/passwd文件含义
作用
-
记录用户账户信息:共分为7段,使用冒号分割
含义
-
文件内容意义:账户名:密码代号x:UID:GID:注释:家目录:SHELL
-
第7列/sbin/nologin:不允许登录
示例
# 在passwd中检索包含root的行信息
[root@server ~]# grep -n “root” /etc/passwd
# 在passwd检索不能登录的信息
[root@server ~]# grep -n "/sbin/nologin" /etc/passwd
# 在passwd中检索可以登录的账户信息
[root@server ~]# grep -nv "/sbin/nologin" /etc/passwd (反向)
# 检索包含“halt”的行及下3行信息
[root@server ~]# grep -nA3 "halt" /etc/passwd
# 检索包含“sshd”的行及上5行信息
[root@server ~]# grep -nB5 “sshd” /etc/passwd
# 检索包含“ftp”的行及上下2行
[root@server ~]# grep -nC2 “ftp” /etc/passwd
# 检索不能登录的账户个数
[root@server ~]# grep -c “/sbin/nologin” /etc/passwd
# 相当于 grep -n “/sbin/nologin” /etc/passwd | wc -l
# 检索包含大小写字母d的行信息
[root@server ~]# grep -ni "d" /etc/passwd
使用特殊符号匹配
匹配模式 | 说明 |
---|---|
grep h 文件名 | 查找文件里有字符h的行 |
grep ^[q] 文件名 | 匹配以q开始的行 |
grep ^[qf] 文件名 | 匹配以q或者f开头的行 |
grep ^[ ^qf ] 文件名 | 不匹配以q或者f开头的行 |
grep ^[0-9] 文件名 | 匹配以数字开头的行 |
grep q$ 文件名 | 匹配以q结束的行 |
grep ^$ | 过滤空白行 |
grep -r h ./* | 如果要明确搜索当前目录中的子目录有h的行 |
grep -d s kip h ./* | 忽略当前目录下的子目录下的普通文件 |
[root@server ~]# grep ^a /etc/passwd
[root@server ~]# grep -n “^root” /etc/passwd
[root@server ~]# grep -n "^#" /etc/sos/sos.conf
[root@server ~]# grep -n [0-9]$ /etc/sos/sos.conf
[root@server ~]# grep -n ^$ /etc/sos/sos.conf
切割显示-cut
作用
-
cut命令用于按列提取文本内容
格式
cut -d "分隔符" -f列数字 文件名
示例
-
/etc/passwd文件在保存用户数据信息时,每一项值之间是采用冒号来间隔的,如:
[root@server ~]# head 2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
-
基于“行”的方式来提取数据是比较简单的,只需要设置好要搜索的关键词即可,但如果按列搜索,不仅要使用-f参数来设置需要看的列数,还需要使用-d参数来设置间隔符号。
[root@kongd ~]# cut -d : -f1 /etc/passwd
root
bin
daemon
adm
lp
-
例:提取内核版本号
[root@server ~]# uname -a | cut -d " " -f3
-
例:提取IP地址
[root@server ~]# ip a | grep ens160 | grep inet | cut -d "/" -f1 | cut -d " " -f6
# 注意空格
-
例:提取mac地址
[root@server ~]# ip a | grep link/ether | cut -d " " -f6
排序显示-sort
作用
-
sort命令用于对文本内容进行排序显示
格式:
sort -参数 文件名
参数
选项 | 作用 |
---|---|
-f | 忽略大小写 |
-b | 忽略缩进与空格 |
-n | 以数值型排序 |
-r | 反向排序 |
-u | 去除重复行 |
-t | 指定间隔符 |
-k | 设置字段范围 |
示例
-
sort命令执行后默认会按照字母顺序进行排序
[root@server ~]# cat fruit.txt
banana
pear
apple
orange
[root@server ~]# sort fruit.txt
apple
banana
orange
pear
[root@server ~]# cat /etc/passwd | cut -d : -f1 | sort # 取出所有账户名
-
sort -u参数进行去重操作:
[root@server ~]# cat sort.txt
Welcome to openlab.com
Red Hat certified
Welcome to openlab.com
Free Linux Lessons
Linux Course
[root@server ~]# sort -u sort.txt
Free Linux Lessons
Red Hat certified
Welcome to openlab.com
-
数字排序
[root@server ~]# cat number.txt
45
12
3
98
82
67
24
56
9
[root@server ~]# sort -n number.txt
[root@server ~]# sort -nr number.txt # 降序
-
下面的内容是节选自/etc/passwd文件中前五个字段的内容,并进行混乱排序后的样子:
[root@kongd ~]# cat user.txt
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon
polkitd:x:998:996:User for polkitd
geoclue:x:997:995:User for geoclue
rtkit:x:172:172:RealtimeKit
pulse:x:171:171:PulseAudio System Daemon
qemu:x:107:107:qemu user
usbmuxd:x:113:113:usbmuxd user
unbound:x:996:991:Unbound DNS resolver
rpc:x:32:32:Rpcbind Daemon
gluster:x:995:990:GlusterFS daemons
-
上面其实是五个字段,各个字段之间是用了冒号进行间隔,如果想以第三个字段中的数字作为排序依据,那么就可以用-t参数指定间隔符,-k参数指定第几列,-n参数进行数字排序来搞定:
[root@server ~]# sort -t : -k 3 -n user.txt
rpc:x:32:32:Rpcbind Daemon
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon
qemu:x:107:107:qemu user
usbmuxd:x:113:113:usbmuxd user
pulse:x:171:171:PulseAudio System Daemon
rtkit:x:172:172:RealtimeKit
gluster:x:995:990:GlusterFS daemons
unbound:x:996:991:Unbound DNS resolver
geoclue:x:997:995:User for geoclue
polkitd:x:998:996:User for polkitd
去重显示-uniq
作用
-
uniq命令用于去除文本中连续的重复行
格式
uniq -参数 文件名
示例
-
对比两个文本内容进行操作
[root@server ~]# cat uq1.txt
Welcome to openlab.com
Welcome to openlab.com
Welcome to openlab.com
Welcome to openlab.com
Red Hat certified
Free Linux Lessons
Professional guidance
Linux Course
[root@kongd ~]# uniq uq1.txt
Welcome to openlab.com
Red Hat certified
Free Linux Lessons
Professional guidance
Linux Course
文件中字符替换显示-tr
作用
-
tr 指令从标准输入读取数据,经过替换或者删除后,将结果输出到标准输出
格式
tr -参数 替换内容 新内容
参数
-
-c :反选设定字符,符合 “替换内容” 的部份不做处理,不符合的剩余部份才进行转换
-
-d :删除指令字符
-
-s :缩减连续重复的字符成指定的单个字符
示例
-
小写字母全部转换成大写字母
[root@server ~]# cat /etc/passwd | tr a-z A-Z
-
提取IP地址
[root@server ~]# ip a | grep ens160 | grep inet | cut -d / -f1 | tr -s ' ' | cut -d ' ' -f3
例:
[root@localhost /]# echo helloworld | tr l 0 把l字符替换成0字符
he00owor0d
[root@localhost /]# echo helloworld | tr hl 0 把h以及l字符替换成0字符
[root@localhost /]# echo helloworld | tr l 01 把l字符替换成0字符
[root@localhost /]# echo helloworld | tr -t hl 0 等长字符替换;把h字符替换成0字符
[root@localhost /]# echo helloworld | tr -c l 0 反选定;除了l字符之外的字符替换成0字符
[root@localhost /]# echo helloworld | tr -d hl 删除字符;删除hl字符
[root@localhost /]# echo 1 2 3| tr -s " " " " 将多个连续重复字符替换为单个字符;
将多个连续重复的空格字符替换为单个空格字符
[root@localhost /]# df -h | tr -s " " " " | cut -d " " -f 4
面试重点:history
1、让history命令显示出执行用户、执行时间、执行用户IP
vim /etc/bashrc# USER_IP 取ipUSER_IP=$(who -u -m | cut -d'(' -f2 | cut -d')' -f1)=$(who -u -m | awk '{print $NF}'|sed 's/[()]//g')# 定义history命令显示格式export HISTTIMEFORMAT="[%F %T] [$(whoami)] [$USER_IP] "下次登录生效,如果当前生效,使用source或.加载文件[root@system1 day1]# source /etc/profile