[TOC]

0x00 快速入门

bash 命令(Shell灵魂)

描述:bash 是一个为GNU计划编写的Unix shell,它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / Born again)

#用法:    
bash [GNU 长选项] [选项] ...
bash [GNU 长选项] [选项] 脚本文件 ...

#参数说明
-c:若用-c参数,则bash从字符串中读入命令,如果字符串后还有变量就被设定为从$0开始的位置参数
-n:检测脚本是否正确并不执行脚本,仅仅验证语法; (常用)
-v: 在执行脚本的时候,先将脚本内容输出到屏幕上然后执行脚本,如有错误则输出; (常用)
-x:执行脚本并输出执行过程调试利器; (常用)

-i:若用-i参数,则bash是交互的
-s:若用-s参数,则bash从标准输入中读入命令(在执行完-c带的命令之后)直到输入exit
-:单一的号表明参数执行完毕,并且屏蔽此后所跟参数,后面的所有变量都被看作是文件名
--norc:如果bash是交互的,则不执行个人初始化文件:-/.bashrc,如果bash作为sh来运行,这个参数缺省是关闭的
--noprofile:不执行系统范围的启动文件/etc/profile也不执行个人的启动文件-/.bash_profile,-/.bash_login或-/.profile,缺省情况下,bash作为登录的shell时以这些文件作为启动文件
--rcfile文件名:如果bash是交互的,则以此文件作为bash的启动文件替代-/.bashrc
--login:激活bash,伪装为登录shell
--nobraceexpansion:不执行大括号扩展
--nolineediting:在交互状态下不使用GNU的readline库去读取命令即取消了命令行编辑功能
--posix:改变bash的行为,使其符合Posix 1003.2规定的标准
--version:在bash开始时显示此bash的版本号--quiet:不显示版本号和其他信息,这是缺省值

Shell 选项:

-irsD 或 -c 命令 或 -O shopt选项        (仅适合调用)
-abefhkmnptuvxBCHP 或 -o 选项
#请输入`bash -c "help set"' 以获得关于 shell 选项的更多信息
#请输入`bash -c help' 以获得关于 shell 内嵌命令的更多信息

WeiyiGeek.内建命令

实际案例:

#示例1.检测脚本是否正确,并不执行 , 在set命令中也能实现调试
bash -n database.sh   

#执行脚本,输出执行过程,shell脚本自身已经包含了调式选项,能都打印出脚本接受的参数和输入
bash -x database.sh  #-x 选项是打印所有行的信息
sh -x script.sh #使用-x选项跟踪脚本调试shell脚本,能打印出所执行的每一行命令以及当前状态:
# test.sh: line 8: ((: 1++: syntax error: operand expected (error token is "+")
# + '[' 1 -le 100 ']'
# + (( sum+=1 ))
# + (( 1++ ))
# test.sh: line 8: ((: 1++: syntax error: operand expected (error token is "+")
# + '[' 1 -le 100 ']'
# + (( sum+=1 ))
# + (( 1++ ))

子shell(subshells)问题:
运行一个shell脚本时会启动另一个命令解释器,就好像你的命令是在命令行提示下被解释的一样,类似于批处理文件start cmd.bat 里的一系列命令。
每个shell脚本有效地运行在父shell(parent shell)的一个子进程里,这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程。

cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5

如果cmd2 是cd / 那么就会改变子Shell的工作目录,这种改变只是局限于子shell内部,cmd5则完全不知道工作目录发生的变化。子shell是嵌在圆括号()内部的命令序列,子Shell内部定义的变量为局部变量

unset TERMINFO #清理变量名
set -C #转向所产生的文件

WeiyiGeek.临时环境变量


echo 命令

描述:用于输出指定字符串或者变量的值;

echo [选项] "输出内容"
#选项
-n: 一行输出。
-E:不使用反斜杠字符及不激活
-e:激活转义字符,下面是支持反斜杠控制的字符转换列表
\ 转义符
\b 退格键,向左删除键
\n 换行符
\r 回车键
\t 制表符,Tab键
\v 垂直制表符
\c 显示不换行
\0nnn - 按照八进制ASCII码输出字符,其中0为数字零,nnn是三位八进制数
\xhh - 按照十六进制ASCII表输出字符,其中hh是两位十六进制数

补充shell 终端字符颜色:
终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关,shell,python,perl等均可以调用。

#说明:转义序列是以 ESC 开头,可以用 \033 完成相同的工作(ESC 的 ASCII 码用十进制表示就是 27, = 用八进制表示的 33)。
\033[显示方式;前景色;背景色m #方式1
\E[显示方式;前景色;背景色m #方式2

#示例:中括号中1:代表开启高亮颜色,末尾0m:代表关闭颜色
\e[1;开启颜色;文字颜色;背景颜色 String \e[0m关闭颜色


显示方式: 0(默认值)、1(高亮)、22(非粗体)、4(下划线)、24(非下划线)、5(闪烁)、25(非闪烁)、7(反显)、27(非反显)
文字颜色:30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色)
背景颜色:重置=0,40(黑色)、41(红色)、42(绿色)、 43(黄色)、44(蓝色)、45(洋红)、46(青色)、47(白色)

#Shell Code : echo显示带颜色需要使用参数-e
echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"
echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"
for i in `seq 16 255`; do printf "\e[38;5;%sm %s\t" $i $i;done;echo ""

#Python3
>>> print("\033[3;31;40m%s\033[0m"%"输出红色字符")
>>> print("\033[4;31;40m%s\033[0m"%"输出红色字符")

WeiyiGeek.终端字符颜色

控制选项说明:

\33[0m 关闭所有属性 
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m — \33[37m 设置前景色
\33[40m — \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标

echo -e "\033[4C MEasdasdsad \033[0m \033[?25h COOL" #显示光标并左移动4行
MEasdasdsad COOL
echo -e "\033[4C MEasdasdsad \033[0m \033[?25l COOL"

实际案例:

#示例1.原样输出变量字符串若需要原样输出变量字符串(不进行转义),请使用单引号。
echo '$name\"' #$name\"

#示例2.转义字符的使用
$echo -e "123\b \v\t345678 \0101 \x30"
12
345678 A 0
$echo -e "h\ve\vl\nl\to\v"
h
e
l
l o
$echo -e "\x68\t\x65\t\x6c\n\x6c\t\x6f" #十六进制
h e l
l o
$echo -e "`ls | cat -n`" #输出行号
1 bin
2 boot
3 dev
4 etc
echo -e "OK! \c" #显示不换行:
echo "It is a test"


#示例3.输出带颜色
echo -e "\e[1;31m 字符串 \e[0m" #红字默认黑底
echo -e "\e[1;31;42m this is a red color\e[0m" #40m为背景颜色-红字绿底
echo -e "\033[37;31;5mMySQL Server Stop...\033[37;47;0m"
echo -e "\e[37;31;1;5mMySQL Server Stop...\e[37;47;0m"

WeiyiGeek.颜色案例

#示例4.Echo 也可以输出变量长度
$web=123456
$echo $web
123456
$echo ${#web} #${#web} 表示web变量中是6位字符
6

#示例5.Echo 也可以计算数值:
#$((运算式)) or $[运算式]  expr or let 数值运算工具 四种方式
$echo "scale=3;4/8"|bc #"scale保存的小数位数;表达式"|bc #有效数字
.500

va=1;
vb=2;
echo[$va+$vb] #output :[1+2]
echo$[va+vb] #3

echo $(($va+$vb)) #3

let te=$va+$vb #let 没有空格
echo $te #3

result=`expr 3 + 1`    #4, 注意等号,两边不能有空格;
$result=`expr $va + 1`  #4
$result=$(expr $va + 1) #expr 也可以注意+号两边有space


#示例6.定义和输出数组:
movie[0]=ip && movie[1]=tcp
echo ${movie[n]} # 单个数字的数组
echo ${movie[*]} # 显示数组中的全部内容


#示例7.Check External IP (获取外部IP)并采用echo显示
echo -e '\E[32m]' "External IP (外部IP):" '\E[0m' `curl -s http://ipecho.net/plain`
External IP (外部IP): 222.177.8.229

#linux获取外网ip其方法
$ curl -s checkip.dyndns.org | sed 's/.*IP Address: \([0-9\.]*\).*/\1/g'

$ curl ifconfig.me
$ curl icanhazip.com
$ curl ident.me
$ curl ipecho.net/plain
$ curl whatismyip.akamai.com
$ curl tnx.nl/ip
$ curl myip.dnsomatic.com
$ curl ip.appspot.com
$ curl http://ip.3322.net
$ curl icanhazip.com
```
![WeiyiGeek.echo数组](https://raw.githubusercontent.com/WeiyiGeek/blogimage/master/2019/20190611122521.png)

补充:Linux本机的纯字符界面是不支持中文的!

<br/>

##### printf 命令
描述:printf命令格式化并输出结果到标准输出,是echo命令的增强版,它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同;
注意:printf 由 POSIX 标准所定义,移植性要比 echo 好,但是不会像echo那样自动换行;

```bash
#usage:
printf format-string [arguments...]
format-string 为格式控制字符串,建议使用单双引号
arguments 为参数列表,使用空格分离,不用逗号

- 表示左对齐、
+ 表示右对齐、

WeiyiGeek.转义字符

实际案例:

#示例1.printf 常规使用:
# format-string为双引号
$ printf "%d %s\n" 1 "abc"
1 abc

# 单引号与双引号效果一样
$ printf '%d %s\n' 1 "abc"
1 abc

# 没有引号也可以输出
$ printf %s abcdef
abcdef


#示例2.格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
$ printf %s abc def
abcdef
$ printf "%s\n" abc def
abc
def
$ printf "%s %s %s\n" a b c d e f g h i j
a b c
d e f
g h i
j


#示例3.如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
$ printf "%s and %d \n"
NULL(Empty) and 0
## 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
$ printf "The first program always prints'%s,%d\n'" Hello Shell
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0'


#示例4.进制转换
#\ddd 三位Octal转换为ASCLL(注意与Dec转Ascll有些异同)
比如:00111001(B) 71(H) 57(D) 39(O) 9(ASCII)

$printf "\066\t\067\t\070\t\071\n" #OCT
6 7 8 9
$ printf "\x30 \x31 \x32 \n\x40 \x41 \x42\n"
0 1 2
@ A B


#示例5.字符对齐与小数
%-5s 格式为左对齐且宽度为5的字符串代替(-表示左对齐),不使用则是右对齐。
%-4.2f 格式为左对齐宽度为4,保留两位小数。

#!/bin/bash
printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323


#示例6.可以直接从文件读取
printf "%s \n" $(cat 1.txt)
#!/bin/bash
#这种方法执行学习
cat 1.txt |\
while read num
do
4printf "$num:%X \v" $num
done


#示例7.printf格式化字符串高级用法
printf "del key\r\n"|nc 127.0.0.1 11211 &>/dev/null #监控memcache是否工作正常
printf "set key 0 0 10\r\nweiyigeek1\r\n"|nc 127.0.0.1 11211 &>/dev/null #监控redis或者mysql也可以使用睁眼的方法
printf "get key\r\v"|nc 127.0.0.1 11211|grep 'weiyigeek1'|wc -l


sleep 命令

描述:sleep命令暂停指定的时间。

Usage: sleep NUMBER[SUFFIX]...
or: sleep OPTION
#参数:
时间:指定要暂停时间的长度
时间长度,后面可接 s、m、h 或 d,其中 s 为秒,m 为 分钟,h 为小时,d 为日数

案例示例:

#示例1.循环方式运行的监控脚本,设置间隔时间(值得学习)
#!/bin/bash 
b='' 
for ((i=0;$i<=100;i++))
do 
    printf "Progress:[%-100s] %d %%\r" $b $i # 输出[100个占为符号] 输出百分之几 
    sleep 0.1 
    b=#$b  # 输出'#'还在不断叠加
done
echo

#执行结果
Progress:[####################################################################################################]100%


#示例2.sleep后面可以设置number+时间
#!/bin/bash
for i in $(seq 1 5)
do
4echo $i;echo `date`
4sleep 1m
done

WeiyiGeek.sleep


date 命令

描述:Date 命令的使用查询当前系统时间,新装的CentOS系统服务器可能设置了错误的,需要调整时区并调整时间.

1)%s存在于GNU扩展版本.像在solaris等UNIX上没有该参数.
2)1970-01-01 00:00:00指的是UTC时间. (date -u得出来的时间)UTC是协调世界时(Universal Time Coordinated)英文缩写,又称世界标准时间 并由国际时间局(BIH)负责保持的以秒为基础的时间标度。UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示.北京时间比UTC时间早8小时。
以1999年1月1日0000UTC为例,UTC时间是零点,北京时间为1999年1月1日早上8点整
3)在国际无线电通信场合,简称UTC整个地球分为二十四时区,每个时区都有自己的本地时间,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated), UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。

如下是CentOS系统使用NTP来从一个时间服务器同步:

  • 第一步: 把当前时区调整为上海就是+8区,想改其他时区也可以去看看/usr/share/zoneinfo目录;
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    $cat /usr/share/zoneinfo/Asia/Chongqing

第二步:利用ntpdate同步标准时间

yum install -y ntpdate  #注:没有安装ntpdate的可以yum一下: 
ntpdate us.pool.ntp.org

#完毕!
12 Jun 16:40:16 ntpdate[7015]: adjust time server 107.181.191.189 offset 0.004026 sec
12 Jun 16:42:33 ntpdate[7590]: adjust time server 66.79.136.235 offset -0.005317 sec

使用语法:

date [参数]
<+时间日期格式>:指定显示时使用的日期时间格式。
-d <字符串>:显示字符串所指的日期与时间
-s <字符串>:根据字符串来设置日期与时间。
-u:显示UTC;

#字符串前后必须加上双引号;
年份是Year
月份是Month
周期是Week,缩写是,w
日是,Day,缩写是,d
小时,hour,缩写是 h
分钟是,minute,缩写是,m
秒,second,缩写是 s

##时间的表示%代码:
%S:十进制的秒数,(当前秒数0-59)
%s:(小写s),:能打印出自1970-01-01:00:00:00到当前时间的秒数.


%M:十时制表示的分钟数(0-59)


%H 小时,24小时制(00~23)= %k 小时,24小时制(0~23)
%I 小时,12小时制(01~12)= %l 小时,12小时制(1~12)

%p:本地的AM或PM的等价显示(显示出AM或PM)
%r:12小时的时间(带上下午和分钟秒数)


%a 星期的简称(Sun~Sat)
%A 星期的全称(Sunday~Saturday)
%u:每周的第几天,星期一为第一天:(值从0到6,星期一为0)= %w:十进制表示的星期几(值从0到6,星期天为0)


%h,%b 月的简称(Jan~Dec)
%B 月的全称(January~December)
%m:十进制表示的月份(01~12)

%d:十进制表示的每月的第几天 = %e:在两字符域中,十进制表示的每月的第几天


%C:年份的前两位数字
%g:年份的后两位数字,使用基于周的年=%y:不带世纪的十进制年份(值从0到99)

%Y:带世纪部分的十制年份 = %G:年分,使用基于周的年
%j:十进制表示的每年的第几天(001~366)
%W:每年的第几周,把星期一做为第一天(值从0到53)
%U:第年的第几周,把星期日做为第一天(值从0到53)
%V:每年的第几周,使用基于周的年

%R:显示小时和分钟:hh:mm
%T:显示时分秒:hh:mm:ss
%X:标准的时间串:%H:%M:%S
%D:月/日/年
%F:年-月-日
%c:标准的日期的时间串 (Tue Nov 20 14:12:58 2012)
%x:标准的日期串
%z,%Z:时区名称,如果不能得到时区名称则返回空字符。

%n:新行符
%t:水平制表符
%%:百分号 (类似转义符号)

实例演示:

#示例1.CST(北京时间)与UTC时间
$date
2019年 06月 04日 星期二 09:29:08 CST
$date -u
2019年 06月 04日 星期二 01:28:49 UTC


#示例2.使用%显示出时间
$date "+%Y-%m-%d %H:%M:%S"
2019-06-04 09:34:01
date '+%y-%m-%d'
16-09-29 #/%y/%Y:2016/16

WeiyiGeek.date%示例

#示例3.设置系统时间
date -s "20190605"

WeiyiGeek.设定时间

#示例4. 当前时间/减去/加上 10 天:
$date -d "" +%Y-%m-%d
2019-06-04
date -d "-10 day" +%Y-%m-%d
date -d "10 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 -d "1 day ago" +"%Y-%m-%d"
date -d "-1 day" +"%Y-%m-%d"

#示例5.传说中的 1234567890 (%s) 秒:
date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S"
2009-02-13 23:02:30
date -d "2009-12-12 13:04:58" +"%Y/%m/%d %H:%M:%S"  #普通转格式
2009/12/12 13:04:58 
date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M:%S"  #apache格式转换

date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M:%S" #格式转换后时间游走
date -d "2009-12-12 13:04:58 2 year ago" +"%Y/%m/%d %H:%M:%S" 
007/12/12 13:04:58 


#示例5.检查一组shell脚本或者程序执行的时间
#!/bin/bash
start=$(date +%s) 
nmap man.linuxde.net &> /dev/null
end=$(date +%s)
difference=$(( $end-$start ))
echo $difference seconds.


time 命令

描述:time命令用于统计给定命令所花费的总时间,所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。

注意:在shell中使用必须使用绝对路径/usr/bin/time 才有选项,使用带参数的必须进行下载 yum install time

#语法
time 参数 #指令指定需要运行的指令及其参数

实际案例:

#示例1.当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。
$time ls
test.sh winpe_win10_amd64.iso www.sh
#输出的信息分别显示了该命令所花费的real时间、user时间和sys时间。
real 0m0.001s
user 0m0.000s
sys 0m0.001s

  • real 时间:是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。
  • user 时间:是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。
  • sys 时间:是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。
#示例2.使用-o选项将执行时间写入到文件中:
/usr/bin/time -o outfile.txt ls
0.00user 0.00system 0:00.00elapsed 94%CPU (0avgtext+0avgdata 1024maxresident)k
0inputs+0outputs (0major+313minor)pagefaults 0swaps


#示例3.使用-a选项追加信息:
/usr/bin/time -a -o outfile.txt ls

#使用-f选项格式化时间输出:
/usr/bin/time -f "time: %U" ls
/usr/bin/time -f "time: %E - %U - %S - %w - %c - %k %K" ls outfile.txt test.sh winpe_win10_amd64.iso www.sh
time: 0:00.00 - 0.00 - 0.00 - 1 - 0 - 0 0

/usr/bin/time -f "time: %C,%k,%w,%Z,%P,%w" whoami
root
time: whoami,0,3,4096,70%,3
#执行的命令,接收信号量数量,进程交换出主存的次数,系统页面大小(学过操作系统的应该知道 内存磁盘交换),进程获取CPU的百分比,上下文切换次数

WeiyiGeek.time格式化参数


tr 命令(常用)

描述:这个命令是及其重要的可以和三剑客联合使用达到非一般的效果,可以对来自标准(stdin)输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。

语法参数:

tr [选项]... SET1 [SET2]

#选项
-c或——complerment:取代所有不属于第一字符集的字符;
-d或——delete:删除所有属于第一字符集的字符;
-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。

#SET 是一组字符串,一般都可按照字面含义理解。解析序列如下:
\NNN 八进制值为NNN 的字符(1 至3 个数位)
\\ 反斜杠
\a 终端鸣响
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
字符1-字符2 #从字符1 到字符2 的升序递增过程中经历的所有字符 [0-9]
[字符*] #在SET2 中适用,指定字符会被连续复制直到吻合设置1 的长度
[字符*次数] #对字符执行指定次数的复制,若次数以 0 开头则被视为八进制数
[:alnum:] 所有的字母和数字
[:alpha:] 所有的字母
[:cntrl:] 所有的控制字符
[:digit:] 所有的数字
[:graph:] 所有的可打印字符,不包括空格
[:lower:] 所有的小写字母
[:upper:] 所有的大写字母
[:print:] 所有的可打印字符,包括空格
[:punct:] 所有的标点字符
[:space:] 所有呈水平或垂直排列的空白字符
[:blank:] 所有呈水平排列的空白字符
[:xdigit:] #所有的十六进制数
[=字符=] #所有和指定字符相等的字符

#字符集1:指定要转换或删除的原字符集。
#字符集2:指定要转换成的目标字符集。
Tips:当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;

实际案例:

#示例1.字符替换
#'A-Z' 和 'a-z'都是集合,集合是可以自己制定的,例如:'ABD-}'、'bB.,'、'a-de-h'、'a-c0-9'都属于集合,集合里可以使用'\n'、'\t',可以可以使用其他ASCII字符。
echo "HELLO WORLD" | tr 'A-Z' 'a-z' #将输入字符由大写转换为小写:
# hello world
echo "HELLO WORLD" | tr 'HLW' 'hlw'
# hEllO wORlD
$echo "HELLO WORLDW" | tr 'HLW' 'hl' #注意当字符集1集合数量大于字符集2集合数量的时候,便会用字符集2最后一个字符来
# hEllO lORlDl


#示例2.字符删除
echo "hello 123 world 456" | tr -d '0-9'
# hello world
# 将文件里面制表符(tab)转换为空格:
cat text | tr '\t' ' '
# hello-world


#示例3.字符集补集,从输入文本中将不在补集中的所有字符删除 -c "只留下指定的字符集":
#此例中,补集中包含了数字0~9、空格和换行符\n,所以没有被删除,其他字符全部被删除了
echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n'
# 1 2 3 4


#示例4.用tr压缩字符,可以压缩输入中重复的字符(-s):
echo "thissss is a text linnnnnnne." | tr -s 'sn'
# this is a text line.
grep -v -E '^#' /etc/ssh/sshd_config | tr -s '\n' #常用取消显示多个空白行(即连续换行)


#示例5.# 对应替换 -t (依次对应):
cat 1.txt | tr -t "ello" "Hell"
# HHlll Wlrld


#示例6.# 巧妙使用tr做数字相加操作:
echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 0 ] #值得学习


#示例7.删除Windows文件“造成”的'^M'字符,类似玉dos2unix的作用
cat file | tr -s "\r" "\n" > new_file
cat file | tr -d "\r" > new_file


#示例8.使用字符类来进行设置
echo "qwe1234,./zxcad" | tr -d -c '[:digit:] \n' #-c 相当于取反的效果
1234
echo "qwe1234,./zxcad" | tr -d '[:punct:]' # 删除所有的标点字符
qwe1234zxcad
echo "qwe1234,./zxcad" | tr -d -c '[:punct:] \n' #删除所有非标点字符
,./


#示例9.从文件中读取字符串进行出现
tr ' ' '\n'<demo.tx


basename 命令

描述:用于打印目录或者文件的基本名称,basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。
语法参数:

Usage: basename NAME [SUFFIX]
or: basename OPTION... NAME...
-a, --multiple #支持多个文件路径 参数
-s, --suffix=SUFFIX #remove a trailing SUFFIX 删除尾随后缀
-z, --zero # separate output with NUL rather than newline 使用NULL而不是换行分隔输出

实际案例:

#示例1.要显示一个shell变量的基本名称请输入
basename $WORKFILE #如果WORKFILE代表路径变量
basename $HOME
# root
basename /var/log/messages
# messages
[[email protected] ~]# basename /etc/php.ini
php.ini
[[email protected] ~]# basename /etc/nginx/
nginx


#示例2.其他示例
basename include/stdio.h .h -> "stdio"
basename -s .h include/stdio.h -> "stdio"
basename -a any/str1 any/str2 -> "str1" "str2"


#示例3.shell中进行使用,#当然也可以在shell中引用当前名字
#!/bin/bash #test.sh
basename ${0}

#构造一个和另外名称相同*(除了后缀)的文件名称请输入
Filename=`base /home/weiyigeek/program.c .c`.o #重新拼接的program.o文件


dirname 命令

描述:去除文件名中的非目录部分,仅显示与目录有关的内容,dirname命令读取指定路径名保留最后一个/及其后面的字符,删除其他部分,并写结果到标准输出n如果最后一个/后无字符,dirname 命令使用倒数第二个/,并忽略其后的所有字符。

实际案例:

#示例1.出现绝对路径中的文件名称,返回起文件存在的路径目录
$dirname /home/tank/test.bz2
/home/tank
dirname /usr/bin/ -> "/usr"
dirname dir1/str dir2/str -> "dir1" followed by "dir2"
dirname stdio.h -> "."

WeiyiGeek.dirname目录


描述:readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置.简单地说就是一直跟随符号链接,直到直到非符号链接的文件位置,限制是最后必须存在一个非符号链接的文件。

语法参数:

-f, --canonicalize   # 通过递归地跟踪给定名称的每个组件中的每个符号链接来规范化;

实际案例:

#示例1.查找当前运行脚本的实际连接地址
readlink -f /bin/bash #相当于是软连接
# /usr/bin/bash


nproc 命令

描述:打印当前进程可用的处理单元数哪个可能小于在线处理器的数量;

实际示例:

#示例1.当前进程可用处理单元数
nproc --all
1


seq 命令

描述:seq命令用于产生从某个数到另外一个数之间的所有整数,主要可以用于生成密码字典;(Important)

基础语法:

seq [选项] 尾数  #默认从1开始
seq [选项] 首数 尾数 #默认从1开始,可指定为0
seq [选项] 首数 step数 尾数 #指定步数

#选项
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同,注意不能和-f一起用,输出是同宽的

实际案例:

#示例1.基础示例
$seq 3
1
2
3
$seq 0 3
0
1
2
3
$seq 0 2 5
0
2


#示例2.%后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格。
$seq -f"%3g" 9 11
# 9
# 10
# 11
$seq -f"str%03g" 9 11 #$这样的话数字位数不足部分是0,%前面制定字符串。
# str009
# str010
# str011


#示例3.-w选项:指定输出数字同宽
$seq -w 98 101
098
099
100
101


#示例4.-s选项:指定分隔符(默认是回车)
$seq -s " " -f "str%03g" 9 11
str009 str010 str011

#要指定/t做为分隔符号:
$seq -s "$(echo -e '\t')" 9 11
9 10 11