符号
> 定向,重定向,打开一个文件内容,把他定向到另外一个文件
举个栗子:cat 1.txt>2.txt 将1.txt中的内容重定向到2.txt中,两个文件内容完全相同
>> 追加,在原有内容的基础上进行追加,不对原有内容进行覆盖
. 当前目录、
./ 当前目录下的全部文件
& 后台执行
&& 表示前一条命令执行成功时,才会执行后一条命令。 短路与
举个栗子: echo '1' && echo '2'
| 管道命令,将前一个命令的输出变成后一个命令的输入
举个栗子: ps -ef|grep Oracle
|| 表示上一条命令执行失败后,才执行下一条命令。 短路或
举个栗子:cat nofile || echo "fail"
操作虚拟机
1. 重启虚拟机
init 6 shutdow -r now reboot (常用)
2. 查看当前系统的全部用户
/etc/passwd 权限不够时可以用sudo cat /etc/passwd
3. 退出登录
exit
4. 如何卸载firefox浏览器
rpm -e firefox
5. /var下一般放置什么文件?
溢出的大文件
6. 应用程序一般都安装在那个目录。
/usr
7. 日志一般都存放在那个目录下
/var/log
8. 如何查看计算机中共有几块磁盘
fdisk -l
9. 如何挂载sdb2到/mailbox下
mount /dev/sdb2 /mailbox
10. 卸载sdb2磁盘的挂载
umount /dev/sdb2
11. 有一块1块80G的SCSI硬盘,已经分成3个区,开机后查看当前系统的磁盘设备所有分区
fdisk -l
12. 如何启动重启sshd服务
service sshd start
service sshd restart
13. 如何把A主机中的a.txt文件复制到B主机中,A主机IP 1.1.1.1 B主机Ip 1.1.1.2 用户名root
scp a.txt root@1.1.1.2:/
14. 修改网卡的配置文件的完整路径
/etc/sysconfig/network-scripts/ifcfg-eth0
15. 关闭网卡eth0
ifdown eth0 && ifup eth0
16. yum安装本地ftp步骤
1. mount /dev/cdrom /mnt
2. 配置yum 源 vim/etc/yum.repos.d/aa.repo baseurl=file:///mnt/Server enable=1 gpgcheck=0 3. yum -y install vsftpd
17. 挂载文件系统到指定目录
mount /dev/cdrom 要挂载的目录
18. 卸载文件系统
umount /挂载点
19. ssh默认端口号
22
20. 显示块设备及分区信息
lsblk
21. 显示和配置网络接口信息
ifconfig
22. 显示网络状态和链接信息
netstat -nltp
-n: 用于禁止将IP地址和端口号转换为对应的域名和服务名称。
-l: 用于只显示处于监听状态的网络连接。
-t: 用于只显示TCP协议的网络连接。
-p: 用于显示与每个连接关联的进程的PID和进程名称。
--------------------------
stdin 标准输入
stdout 1> 标准输出
stderr 2> 标准错误输出
linux命令
详细命令:Linux 命令大全 | 菜鸟教程
su 切换用户,建议使用su - 加载环境变量
sudo 授予权限
cd 切换目录
ls 查看当前文件下的目录
ls -alh 显示全部文件和目录,包括隐藏文件
ll ls -l
pwd 显示当前目录的路径
chown mysql:hadoop 1.txt 切换用户和用户组
chown -R 递归授权,将目录下的全部文件和目录等的用户和用户组全部改变(不常用)
diff 1.txt 2.txt 比较两个文件的差异性,相同则没有返回值,不同则返回不同的位置和内容
df -h 查看磁盘的使用情况,主要用于整个文件系统
df -H 以国际单位制显示磁盘空间,1KB=1000字节
df -hT 查看空闲空间
du -h 查看磁盘使用情况,主要用于某个文件
wc 统计文件内的行数,单词数和字符数
wc -l 统计文件行数
------------------------------------------
nohup sh aa.sh > 1.log & -- 挂载后台执行
sh aa.sh > /home/test/a.log 2>&1 & -- 所有的文件都写入文本
查看、显示内容,查找文件
cat
cat 查看文件内容
cat -n 显示文件内容,并在前面添加行号
cat -b 与cat -n相似,但是对于空白行不进行编号
cat -s 对于连续的两行空白行将变成一行
cat /dev/null 空设备文件,黑洞
cat /dev/null >sc.txt 清空文件
echo 1 >/dev/null 无法输出任何,用处:抑制脚本运行中的某些报错信息,把不希望看到的信息屏蔽
tac 倒序显示文件内容(仅按行进行倒序)
more 1.txt 逐页查看文本内容,上一页用b,下一页用空格或回车,退出用q
less 1.txt 用less工具打开文件,相比于more功能更全面
find
find [path...] [-option] 参数
find [起始目录] [搜索条件] [操作]
举个栗子:find . -type d -name 'user*'
在一个目录(及子目录)中搜索文件,可以指定一些匹配条件,如按文件名、文件类型、用户甚至是时间戳查找文件。
path:find命令所查找的文件路径,栗子:用 . 来表示当前目录,用 / 来表示系统根目录
options:find命令的常用选项
-size:匹配文件大小 栗子:find ./ -size 0 显示文件大小为零的文件
-name:按文件名查找 find / -name '*.java' 查找根目录下以.java结尾的文件
-perm:按照文件权限来查找文件 find ./ -perm 775 -print 查找775权限的文件,-print打印文件匹配的路径
-user:按照用户来查找文件 find ./ -user root -print 查找用户为root的文件
-group:按照用户组来查找文件 find ./ -group hadoop -print
-mtime:按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天 以内
+n表示文件更改时间距现在n天 以前
find / -mtime -5 -print 在根目录下查找更改时间在5日以内的文件
find / -mtime +3 -print 在根目录下查找更改时间在3日以前的文件
-type:查找某一类型的文件 find /etc -type d -print 在etc目录下查找所有的目录
tail
tail命令课英语查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。
tail -3 /etc/group 查看系统最后创建的三个组
tail catalina.out查看当前时间点最后10行(默认为10行)
tail -100 catalina.out查看当前时间点最后100行
tail -100f catalina.out 从当前时间点最后100行开始持续刷新
tail -c 10 catalina.out 查看最后10个字节
tail -n 显示文件的最后几行,默认为10行
tail -n 5 显示文件的最后5行
tail -n +8 1.txt 显示文件从第8行开始显示剩余的部分(第8行及之后的内容)
head
head命令可用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为10,即显示10行的内容
head -n 5 catalina.out 查看前5行
head -c 10 catalina.out 查看前10个字节
cut
cut [选项] [文件]
cut命令用于显示每行从开头算起 num1 到 num2 的文字。
cut [-option] filename option:
-b 字节
-c 字符(常用)
-f 提取第几列/字段
-d 按指定分隔符分割列
--complement 选项提取指定字段之外的列
--version 显示指令的版本信息。
awk
awk 擅长取列
用法:awk [options] ‘{print NR,$0}’ file
-F 指定字段分隔符
NR 表示行号
$0 表示这一行的内容,代表本身
$1 数字 某一列
$NF NF表示列数。$NF表示最后一列
-v var=value or --asign var=value 赋值一个用户定义变量。
-f scripfile or --file scriptfile 从脚本文件中读取awk命令。
-------------------------------
举个栗子:取出ip地址
ifconfig ens33|awk -F ' ' '{print $4}'|awk 'NR==2'
ifconfig ens33|awk -F ' ' 'NR==2{print $4} '
ifconfig ens33|awk -F ' ' 'NR>1&&NR<3{print $4} '
ifconfig ens33|sed -n 2p|awk -F ' ' '{print $4}'
-------------------------------
举个栗子:
awk '{print NF}' 2.txt 查看每行有几个字符
awk '{print NR}' 2.txt 查看行号
awk '{OFS="#"}{print $1,$2,$3}' test_awk.txt 打印123列,指定#为连接符
-------------------------------
多分隔符
grep -n '商务' aa.txt |awk -F '[:|]' '{print $1,$4}'
-------------------------------
END: 这是一个特殊的模式,用于在所有输入处理完之后执行相应的操作
文件类型
b 块设备文件
d 目录
c 字符设备文件
p 管道文件
l 符号链接文件 软连接:相当于快捷方式 硬链接:镜像,物理备份
f 普通文件
文件执行的三种方法
1.shell脚本方法,不需要权限(忽略权限)
sh temp.txt
2.相对路径
. temp.txt
可以识别到子shell
3.绝对路径,权限限制
/home/hadoop/mym/temp.txt
4.在脚本中执行脚本
source temp.txt
vi编译器
vim是一个类似vi的文本编译器,在vi的基础上添加了许多特性,vim被公认为是vi编译器中最好用的一个。
编译器操作
shift+\:光标行最前面
shift+$:光标行最后面
G:进入最后一行
gg:进入第一行
i:开始插入
o:从下一行插入
:3:定位到第三行
a:光标的下一个字符开始插入
dd:删除当前行
u:撤销操作
yy:复制
p:粘贴
dG:删除目标行开始及以后的全部行
shift+v:选中当前行
:set nu:显示行号
:1s/a/b/g:第1行,把a替换成b,加了/g全行替换,不加则替换一个
:%s/a/b/g:全局替换(可以不加/g)
:1,3s/a/b/g:1-3行替换(可以不加/g)
:10,50 del:删除10-50行的内容(包含10和50)
:50,100 s/man/MAN/g:vim如何把文档中50到100行之间的man改为 MAN
----------------
退出模式
:w 保存文件但不退出,可以继续编译
:wq或x 保存文件并退出编译器
:q! 强制退出编译器,而不保存文件
vi 查看文件内容(vi编辑器)
vi /etc/profile 查看环境变量
alias vi =>vim vim别名vi,vim在vi的基础上进行了改进和扩展
cp复制
cp 1.log 2.log 复制文件,复制1.log到2.log
cp -r 复制该目录下所有子目录和子文件
cp -f 如果指定移动的源目录或文件与目标目录或文件同名,直接覆盖旧文件
cp -rf 递归复制,多数使用
cp -p 复制并保持原属性不变
scp temp.txt root@192.168.232.130:/root/
scp 文件名 用户名@主机号:目标地址 远程传输,复制文件put推
scp root@hd003:/root/temp.txt .
scp 用户名@主机名:文件拉取的地址 当前地址或者目标地址 远程拉取文件或目录,当前地址可以用.代替
删除移动
rm 删除
rm -i 询问是否删除
rm -r 删除目录
rm -f 直接删,不会询问
rmdir 删除目录
rm -rf * 删库跑路(慎重)
mv -f 如果指定移动的源目录或文件与目标目录或文件同名,直接覆盖旧文件
mv sc1.txt sc.txt 改名
mv sc.txt mym 移动位置,从外往里移,从里往外移,移动到上一级目录中mv sc.txt ..
cat /dev/null 空设备文件,黑洞
cat /dev/null >sc.txt 清空文件
echo 1 >/dev/null 无法输出任何,用处:抑制脚本运行中的某些报错信息,把不希望看到的信息屏蔽
rpm -e firefox 如何卸载firefox浏览器
创建
mkdir 创建目录
mkdir -p text1/text2 递归创建文件夹
touch 创建文件
echo 1>temp.txt 把1写入文件temp.txt中
echo 1 打印1
echo 1>3.txt 直接创建文件3.txt,并将1写入文件中
echo -e -e为转译字符的解释功能
cat <<EOF >3.txt 通过窗体输入内容,遇到EOF结束(EOF可变)将内容插入3.txt中,新内容覆盖原有的内容,文件不存在时创建文件。
操作内容,文件处理
sed
nl 加行号
--------------------------
sed利用脚本来处理文本文件
sed可依照脚本的指令来处理、编辑文本文件
sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等
--------------------------
sed [option] "[action]" [filename]
option:
h/help:显示帮助
n:显示scrip处理后的结果
V/version:显示版本信息
e:允许对输入数据应用多条sed命令进行编辑
f:直接将sed的动作写在一个文件内,-f filename则可以运行,filename内的sed动作。
--------------------------
当使用''包围sed命令的脚本时表示其中的模式和特殊字符将不会被解释和展开
sed命令不该表文件中的内容,仅在输出时进行改变
--------------------------
action(创建新的输出文件,不是在原文件上进行改变):
s:取代,替代。可以直接进行取代的工作,通常这个s的动作可以搭配正规表示法
sed 's/dog/pig/g' 将每一行的dog换成pig,g用来终止s命令
d:删除。因为是删除,所以后面通常不接任何东东。
sed '5d' 2.txt 删除第五行
sed '1,5d' 2.txt 删除1-5行
sed '3,$d' 2.txt 删除第三行及以后的
i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现(当前的上一行)
sed '3i\lalalala' 1.txt 像第三行前插入lalalala
a:新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)
c:取代,c的后面可以接字符串,这些字符串可以取代n1,n2之间的行,替代或插入一行文本
sed '3c\lzj is a dog' 1.txt
p:打印,亦即将某个选择的数据印出,通常p会与参数 sed -n 一起运行
--------------------------
-n搜索 不加的情况会将扫描的文本显示出来,扫描一行显示一行,需要则再显示一遍,不需要则不显示第二遍
sed -n '3p' 2.txt 查询第三行的内容
sed -n '1,3p' 2.txt 查询1-3行的内容
sed -n 'p' 2.txt 查询全部内容
-i修改 在原文件上进行改变,不创建新的输出文件
sed -i '4d' 1.txt
grep
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)
grep [OPTIONS] PATTERN [FILE]
-----------------------------
匹配开头 grep '^s' 举个栗子:ls |grep '^c'
匹配结尾 grep 'txt$' ls |grep 'txt$'
-----------------------------
-number:同时显示匹配行上下的行
grep -2 pattern filename 同时显示匹配行的内容
-c,--count 只打印匹配的行数,不显示匹配的行
-i,--ignore-case忽略大小写差别
-n,--line-number!!!在匹配前面打印行号
-v,--revert-match反检索,只显示不匹配的行
-----------------------------
^word 表示带搜寻的字符串(word)在行首
word$ 表示带搜寻的字符串(word)在行尾
. 表示1个任意字符
\ 表示转义字符,在特殊字符前加\会将原本的特殊字符意义去除
* 表示重复0到无穷多个前一个RE(正则表达式)字符
[list] 表示搜索含有list的字符串
[n1-n2] 表示搜索指定的字符串范围,例如[0-9] [a-z] [A-Z]等
[^list] 表示反向字符串的范围,例如[0-9]表示非数字字符,[A-Z]表示非大写字符范围
\{n,m\} 表示找出n到m个前一个RE字符
\{n,\} 表示n个以上的前一个RE字符
egrep
+ 表示重复一个或一个以上的前一个RE字符
举个栗子: egrep 'go+d' regular_express.txt
表示搜寻(god)(good)(goood)...等等字符串,o+代表[一个以上的o]
? 表示重复零个或一个的前一个RE字符
举个栗子: egrep 'go?d' regular_express.txt
表示搜寻(gd)(god)字符串,o?代表[空的或1个o]
注:egrep下'go+d'和'go?d'的结果集合就等于grep下的'go*d'
| 表示用或(or)的方式找出数个字符串
举个栗子: egrep 'gd|good|dog' regular_express.txt
表示搜寻(gd)或(god)或(god)字符串,|代表或
() 表示找出群组字符串
举个栗子: egrep 'g(la|oo)d' regular_express.txt
表示搜寻(glad)或(good)字符串
() +表示找出多个重复群组的判别
举个栗子: echo 'AxyzxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
表示搜寻开头是A结尾是C,中间有一个以上的'xyz'字符串
wc
wc指令我们可以计算文件的Byte数、字数、或是列数
-c 或 --bytes或--chaes只显示Bytes数
-l 或 --lines显示行数
-w 或 --words只显示字数
-m 统计字符数
crontab 挂载,任务定时
crontab -e 编辑
crontab -l 查看 查看任务列表,删除计划任务
crontab -r 删除
周期计划任务的时间顺序 分 时 日 月 周
举个栗子:每月10号及20号的3:30执行ls命令
30 3 10,20 * * /bin/ls
查看状态: service crond status
停止状态: service crond stop
启动状态: service crond start /etc/init.d/crond restart -- 重启
打包和解压缩
gzip命令(应用广泛):可以解开compress、zip与gzip等软件所压缩的文件。
选项与蚕食:
-c:将压缩的数据输出到标准输出(stdout)上
-d:解压缩
-t:可以用来检验一个压缩文件的一致性,查看文件有无错误
-v:显示指令执行过程。
-(1,2,...,9):压缩等级,1最快,但是压缩比最差;9最慢,但是压缩比最好,默认是6.
-l:查看压缩文件的压缩比:gzip -l *.gz
-c:保留压缩文件
-------------------------
tar命令,选项与参数:
-c:简洁打包文件
-t:查看打包文件的内容含有那些文件
-x:姐打包或解压缩的功能,可以打呗-C(大写)在特定到特定目录解开
-j:通过bzip2的支持进行压缩/解压缩;此时文件最好为*.tar.bz2
-z:通过gzip的支持进行压缩/解压缩;此时文件最好为*.tar.gz
-v:在压缩/解压缩的过程中,将正在处理的文件名显示出来
-f filename:-f 后面跟处理后文件的全名称(路径+文件名+后缀名)
-C:目录:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项
-p:保留备份数据的原本权限与属性,常用语备份(-c)重要的配置文件
--exclude=FILE:在压缩的过程中,不要将那些文件打包
注意:-c,-t,-x不可同时出现在一串指令中
---------------------------
tar常用的指令组合
打包与压缩:tar -zcvf [/路径/] filename.tar.gz被压缩的文件或目录
tar -jcvf [/路径/] filename.tar.bz2被压缩的文件或目录
查询:tar -ztvf [/路径/] filename.tar.gz
tar -jtvf [/路径/] filename.tar.bz2
备份:tar -zpcvf [/路径/] filename.tar.gz被备份文件或目录
tar -jpcvf [/路径/] filename.tar.bz2被备份文件或目录
解压到当前目录:tar -zxvf [/路径/] filename.tar.gz
tar -jxvf [/路径/] filename.tar.bz2
解压到指定目录:tar -zxvf [/路径/] filename.tar.gz -C指定目录
tar -jxvf [/路径/] filename.tar.bz2 -C指定目录
linux权限
在Linux操作系统中,文件和目录的权限是通过权限位来管理和控制的。每个文件或目录都有一个用户组和三种权限(读取、写入和执行)分别对应于三个不同的用户:文件所有者、文件所属组和其他用户。以下是关于Linux权限的详细说明:
修改权限 chmod u+x temp.txt
当前用户 u 当前组 g 其他人 o
chown mysql:hadoop 1.txt 切换用户和用户组(主:组)
chown -R 递归授权,将目录下的全部文件和目录等的用户和用户组全部改变(不常用)
1.文件权限位:
读取权限(r):允许用户读取(查看)文件的内容。对于目录,该权限允许用户列出(查看)目录中的文件和子目录。
写入权限(w):允许用户编辑或修改文件的内容。对于目录,该权限允许用户创建、删除或重命名目录中的文件和子目录。
执行权限(x):对于普通文件,该权限允许用户执行文件(如果是可执行程序)。对于目录,该权限允许用户进入(切换到)目录并访问其中的内容。
2.权限位表示方法:
每个文件或目录的权限以形如"rwxrwxrwx"(9个字符)的权限位字符串表示。该字符串可以分为三个部分,每个部分包括三个字符,分别对应于文件所有者、文件所属组和其他用户的权限。每个字符在对应的位置上表示相应权限是否被设置:
"r"表示读取权限;
"w"表示写入权限;
"x"表示执行权限;
"-"表示没有相应的权限。
例如,权限位字符串"rw-r--r--"表示:文件所有者有读取(r)和写入(w)权限,文件所属组和其他用户只有读取(r)权限。
3.修改权限:
可以使用chmod命令来修改文件和目录的权限。chmod命令可以通过数字模式(例如"755")或符号模式(例如"+x","-w")来指定权限的修改方式。数字模式将每种权限映射为一个数字(r=4,w=2,x=1),并将其相加得到一个三位数表示整个权限位的值。符号模式使用"+"、"-"和"="来赋予/取消/设置权限。
例如,要将文件"file.txt"的权限设置为读写(6)权限只给文件所有者,读取(4)权限给文件所属组和其他用户,可以使用以下命令:
chmod 640 file.txt
这会将"file.txt"的权限设置为"rw-r-----"。
4.查看权限:
可以使用ls -l命令来查看文件和目录的权限。该命令将显示文件和目录的详细信息,包括所有者、所属组、权限位等。
Linux权限系统为用户提供了对文件和目录的灵活控制,使其可以限制对敏感数据和系统资源的访问。有效地管理文件和目录的权限可以提高系统的安全性和保护用户的数据。
用户,账户,组
1. 账户,组,其他
groupadd 增加组
useradd -g g1 指定组账户
usermod 修改账户信息命令
usermod -G g1 u1 添加附加组 -G是添加组用户命令 现在将u1添加到了g1组
Usermod -G g1,g2,g3 u1 把u1用户添加到了g1,g2,g3附加组
usermod -u 为指定id命令 usermod -u 600 u1 那么u1的id改为600
2. 查看当前系统的全部用户
/etc/passwd 权限不够时可以用sudo cat /etc/passwd
3. 普通用户的提示符是$
超级用户(root用户)的提示符是#
进程
进程是程序的具体实现,执行程序的具体过程,进程启动时,操作系统为其分配相对应的系统内唯一的进程ID(PID)
常用命令
ps 将某个时间点的程序运作情况截取下来
ps a:和输出重点关联的所有process,通常与x一起使用,列出完整信息
ps x:后台进程
ps u:有效使用者相关的process
---------------------------
常用组合:
ps -aux:观察系统所有的程序数据(常用) 类似于top=》任务管理器
ps -ef:(最常用)
ps -e:等价于'-A',表示列出全部的进程
ps -f:显示全部的列(显示全字段)
---------------------------
|:管道
grep:过滤
ps -ef|grep mysqld:查找mysql服务进程
ps -ef|grep mysql:查找与mysql相关的任何进程
---------------------------
kill:删除执行中的程序
kill -l:列出目前kill能够使用的信号
kill -1(HUP):重新加载进程
kill -9(KILL):杀死一个进程(重点)
kill -15(TERM):正常停止一个进程
---------------------------
free 查看还有多少进程
free -h 一般用此命令
---------------------------
ps -aux 列出当前系统的进程
系统目录结构
Linux 系统目录结构 | 菜鸟教程
ps -aux 显示 BSD格式
USER:进程拥有这
PID:pid
%CPU:占用的CPU使用率
%MEM:占用的物理内存使用率
VSZ:占用的虚拟内存大小
RSS:占用的物理内存大小
TTY:终端的次要装置号码(minor device number of tty)
STAT:该行程的状态:
D:无法终端的休眠状态(通常IO的进程)
R:正在执行中
S:静止状态
T:暂停执行
Z:不存在但暂时无法消除
W:没有足够的记忆体分页可分配
<:高优先序的行程
N:低优先序的行程
L:有记忆体分页分配并锁在记忆体内(实时系统或捱A I/O)
START:行程时间
TIME:执行的开始时间
COMMAND:所执行的指令
-------------------
进程信息
PID:进程ID
USER:进程所有者
PR:进程优先级
NI:nice值,负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES:进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR:共享内存大小,单位kb
S:进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU:上次更新到现在的CPU时间占用百分比
%MEM:进程使用的物理内存百分比
TIME+:进程使用的CPU时间总计,单位1/100秒
COMMAND:进程名称(命令名/命令行)
shell
Shell脚本:Linux Shell脚本学习指南(超详细)
常用为bash shell
在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。
这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。
当然,如果有必要,你也可以使用 Shell declare 关键字显式定义变量的类型,但在一般情况下没有这个需求,Shell 开发者在编写代码时自行注意值的类型即可
#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种shell
注意:在shell脚本中除了第一行的#表示特殊格式外,其他地方的#一般表示注释
重定向
1> 标准输出,重定向到文件,如果文件存在则会覆盖,不存在则创建文件
2> 错误输出,重定向到文件,捕获错误信息,不会影响标准输出
>/dev/null 丢弃标准输出,输出不会保存到文件或显示在终端上
2>&1 将错误输出合并到标准输出,把他们都重定向到文件
内容匹配
常用的正则表达式
标识符号 | 说明 |
---|
^linux | 以linux开头的行 |
$php | 以php结尾的行 |
. | 匹配任意单字符 |
.+ | 匹配任意多个字符 |
.* | 匹配0个或多个字符(可有可无) |
[0-9a-z] | 匹配中括号内任意一个字符 |
(linux)+ | 出现多次Linux单词 |
(web){2} | web出现两次以上 |
\ | 屏蔽转义 |
段内容判断
运算符 | 解释 |
---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ 和 !~ | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
数据类型
字符串:
字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。建议使用双引号,因为双引号里可以有变量和特殊字符,可以按照变量和特殊字符去使用。
整数型:
在Shell中所有的变量默认都是字符串型。默认情况下,所有的数值都是不能进行运算的,如果想要进行数学运算,可以使用“$((运算式))”或“$[运算式]”方式运算。
举个栗子:a=1 b=2
echo $(($a+$b))
或 echo $[$a+$b]
变量
变量的定义赋值与删除 Shell变量:Shell变量的定义、赋值和删除
定义,赋值
1. Shell 支持以下三种定义变量的方式:
variable=value
variable='value'
variable="value"
variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来。使用单引号和使用双引号也是有区别的
------------------------------------------------------------------------------------------------
以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。
以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。
我的建议:如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。
------------------------------------------------------------------------------------------------
(上面都是废话!!!)总结:单引号''输出内容本身,双引号""输出的是运算后的内容
注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。
举个栗子: #!/bin/bash
url="http://c.biancheng.net"
website1='C语言中文网:${url}'
website2="C语言中文网:${url}"
echo $website1
echo $website2
运行结果:C语言中文网:${url}
C语言中文网:http://c.biancheng.net
2. Shell 变量的命名规范和大部分编程语言都一样:
变量名由数字、字母、下划线组成;
必须以字母或者下划线开头;
不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。
举个栗子:
echo $url
name='C语言中文网'
echo $name
author="严长生"
echo $author
3. 已定义的变量,可以被重新赋值,
第二次对变量赋值时不能在变量名前加$,只有在使用变量时才能加$。
------------------------------------------------------------------------------------------------
将命令的结果赋给变量
log=$(cat cc.txt) 或
log=`cat cc.txt`
echo $log
------------------------------------------------------------------------------------------------
4. 其他赋值方式
从键盘读取 read
使用
使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:
author="严长生"
echo $author
echo ${author}
变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
skill="Java"
echo "I am good at ${skill}Script"
如果不给 skill 变量加花括号,写成echo "I am good at $skillScript",解释器就会把 $skillScript 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号{ },这是个良好的编程习惯。
只读变量: 注意: 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。 readonly url
删除
删除变量: 注意: 使用 unset 命令可以删除变量 unset url
只对临时会话生效
变量被删除后不能再次使用。unset 命令不能删除只读变量。
变量的作用域
1. 全局变量
有的变量可以在当前shell会话中使用,这叫做全局变量(global variable)
2. 局部变量
有的变量只能在函数内部使用,这叫做局部变量(local variable)
3. 环境变量
有的变量还可以在其他shell中使用,这叫做环境变量(environment variable)
特殊变量
$0 当前脚本的文件名。
$n (n≥1)传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。
$# 传递给脚本或函数的参数个数。
$* 把参数看做一个数据
$@ 每个参数一个数据,可以进行逐个参数打印,在进行逐个参数打印时需要加双引号
$? 上个命令的退出状态,正确是0,不正确报错误值
$$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。
$! 上一个命令的PID
环境变量
env 查看全局环境变量
常见的环境变量
变量名称 | 解释 |
---|
PATH | 决定了shell将到哪些目录中寻找命令或程序 |
HOME | 当前用户主目录 |
HISTSIZE | 历史记录数 |
LOGNAME | 当前用户的登录名 |
HOSTNAME | 指主机的名称 |
SHELL | 当前用户Shell类型 |
LANGUGE | 语言相关的环境变量,多语言可以修改此环境变量 |
MAIL | 当前用户的邮件存放目录 |
PS1 | 基本提示符,对于root用户是#,对于普通用户是$ |
自定义环境变量
1. vi /etc/profile ,在文件末尾加上要定义的环境变量,语法如下:
export 变量名=变量值
2. wq 退出
3. source /etc/profile
4. 输入 env 查看环境变量,是否有自己定义的环境变量。
5. 使用环境变量
环境变量的使用方式和普通变量是一样的:$环境变量名
字符串
由单引号' '包围的字符串: 任何字符都会原样输出,在其中使用变量是无效的 ; 字符串中不能出现单引号,即使对单引号进行转义也不行。
由双引号" "包围的字符串: 如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出 ; 字符串中可以出现双引号,只要它被转义了就行。
不被引号包围的字符串 : 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样 ;字符串中不能出现空格,否则空格后边的会作为其他变量或者字符串解析。
获取字符串长度
echo ${#str}
查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="i im a boy"
echo `expr index "$string" am` # 输出是: 4 查的是第一个字母而不是整体
字符串截取
从指定位置开始截取:
zfc=cranberry
从字符串左边开始计数:
${string: start :length}
举个栗子: echo ${zfc1: 4} 从0开始计数
berry
echo ${zfc1: 4:2} 省略表示到字符串的末尾
be
从字符串右边开始计数:
${string: 0-start :length} 0-start固定写法
举个栗子: echo ${zfc1: 0-5:2} 从1开始计数
be
echo ${zfc1: 0-5} 默认到结尾
berry
字符串拼接
str1=$name$url 中间不能有空格
str2="$name $url" 如果被双引号包围,那么中间可以有空格
str3=$name": "$url 中间可以出现别的字符串
str4="$name: $url" 这样写也可以
str5="${name}Script: ${url}index.html" 这个时候需要给变量名加上大括号
str6="你好,\"$name\" ."
一般情况使用{}将变量包围
echo $zfc1$zfc2$zfc3
cranberrymymwdggdgwmymt
echo ${zfc1}:${zfc2}-${zfc3}
cranberry:mymwdgg-dgwmym
运算
算数运算符
运算符 | 说明 | 举例 |
---|
+ | 加法 | expr b 结果为 30。 |
- | 减法 | expr b 结果为 -10。 |
* | 乘法 | expr b 结果为 200。 |
/ | 除法 | expr a 结果为 2。 |
% | 取余 | expr a 结果为 0。 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ a == b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ a != b ] 返回 true。 |
注意:条件表达式要放在方括号之间,并且要有空格,例如: ==[ab] 是错误的,必须写成 [ a == b ]。
布尔运算符
运算符 | 说明 | 举例 |
---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ b -gt 100 ] 返回 false。 |
逻辑运算符
流程控制
语句判断
数字判断(关系运算符)
运算符 | 说明 |
---|
-eq | 检测两个数是否相等,相等返回 true。 Equal |
-ne | 检测两个数是否不相等,不相等返回 true。 Not equal |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 great than |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。Less than |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 g |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 |
字符串判断
判断符 | 说明 |
---|
-n STRING | 字符串长度不为零 |
-z STRING | 字符串长度为0 |
= | 判断两个字符串是否一样 |
!= | 判断两个字符串是否不一样 |
文件类型判断
选项 | 说明 |
---|
-f | 判断文件是否存在,并且是否为普通文件 |
-d | 判断文件是否存在,并且是否为目录 |
-h | 判断文件是否存在,并且是否为符号链接 |
-e | 判断文件是否存在 |
-b | 判断文件是否存在,并且是否为块设备文件 |
-c | 判断文件是否存在,并且是否为字符设备文件 |
-L | 判断文件是否存在,并且是否为符号链接文件 |
-p | 判断文件是否存在,并且是否为管道文件 |
-s | 判断文件是否存在,并且是否为非空 |
-S | 判断文件是否存在,并且是否为套接字文件 |
文件权限判断
选项 | 作用 |
---|
–r | 判断文件是否存在,并且是否拥有读权限 |
-w | 判断文件是否存在,并且是否拥有写权限 |
-x | 判断文件是否存在,并且是否拥有执行权限 |
-u | 判断文件是否存在,并且是否拥有SUID权限 |
-g | 判断文件是否存在,并且是否拥有SGID权限 |
-k | 判断文件是否存在,并且是否拥有SBIT权限 |
举个栗子: -z str 判断字符串 str 是否为空。 -n str 判断宇符串 str 是否为非空。
if
1. 语法格式
if condition
then
command1
command2
...
commandN
fi
举个栗子:判断文件是否存在,不存在则创建文件
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
-------------------------------------------
2. if else 形式
if condition
then
command1
command2
...
commandN
else
command
fi
举个栗子:
#!/bin/bash
read -p "Enter your age(1-100):" age
if [ $age -ge 18 ]
then
echo '已经成年!'
else
echo '未成年!'
fi
------------------------------------------
3. if else-if else 语法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
举个栗子:
#!/bin/bash
read -p "Enter your score(0-100):" n #-p参数表示给出提示信息
if [ $n -ge 85 ] && [ $n -le 100 ] ; then
echo "优"
elif [ $n -ge 70 ] && [ $n -le 84 ] ; then
echo "良"
elif [ $n -ge 60 ] && [ $n -le 69 ] ; then
echo "中"
else
echo "差"
fi
for循环
1. 一般格式
for 变量 in 值1 值2 值3…
do
程序
done
举个栗子:
for file in $(ls /root)
do
echo $file
done
2. 数字性循环
for ((初始值;循环控制条件;变量变化))
do
程序
done
举个栗子:
#!bin/bash
for((i=1;i<10;i++))
do
for((j=1;j<=i;j++))
do
echo -n $i "*" $j = $[i*j] ' '
done
echo
done
whell循环
1. 基本格式:
while 条件
do
程序
done
举个栗子:
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
let sum=sum+$i
let i++
done
echo $sum
使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,如果表达式中包含了空格或其他特殊字符,则必须引起来。具体:https://www.runoob.com/linux/linux-comm-let.html
无限循环
1.
while :
do
command
done
2.
while true
do
command
done
3.
for (( ; ; ))
case
case工作方式如下所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
1. 标准格式
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
举个栗子:
#!/bin/bash
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1';;
2) echo '你选择了 2';;
3) echo '你选择了 3';;
4) echo '你选择了 4';;
*) echo '你没有输入 1 到 4 之间的数字';;
esac
跳出循环
1. break
break命令允许跳出所有循环(终止执行后面的所有循环)。
2. continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。不影响下一次循环。
函数
时间函数
自19700101000000以来的秒数 :date "+%s"
昨天的日期 : date -d '1 days ago' "+%Y%m%d%H%M%S" \ date -d '-1 days' "+%Y%m%d%H%M%S"
明天的日期 : date -d '1 days' "+%Y%m%d%H%M%S"
1小时前的时间 :date -d '1 hours ago' "+%Y%m%d%H%M%S"
1小时后的时间 :date -d '1 hours ' "+%Y%m%d%H%M%S"
1分钟前的时间 :date -d '1 minutes ago' "+%Y%m%d%H%M%S" \ date -d "-1 minute" +%Y%m-%d-%H%M
1分钟后的时间 : date -d '1 minutes ' "+%Y%m%d%H%M%S"
1秒前的时间 : date -d '1 seconds ago' "+%Y%m%d%H%M%S"
1秒后的时间 : date -d '1 seconds ' "+%Y%m%d%H%M%S"
将某一时间转换为自19700101000000以来的秒数 : date +%s -d '1990-01-01 01:01:01'
将时间戳转换为日期格式 : date -d '1970-01-01 UTC '$1' seconds' +"%Y-%m-%d %T"
date -d "3 minute ago" +%Y%m-%d-%H%M
202202-16-1642
用“-”分割,截取出第一个参数 : date -d "-3 minute" +%Y%m-%d-%H%M | awk -F '-' '{print $1}'
202202
用“-”分割,截取出第二个参数 : date -d "-3 minute" +%Y%m-%d-%H%M | awk -F '-' '{print $2}'
16
用“-”分割,截取出第二个参数 : date -d "-3 minute" +%Y%m-%d-%H%M | awk -F '-' '{print $0}'
202202-16-1644
date -d "3 minute ago" +%Y%m-%d-%H:%M | awk -F '-' '{print $3}' 16:45
系统函数
basename 删除路径 保留文件
dirname 删除文件 保留路径
用户自定义函数
1. 基本格式
[ function ] funname()
{
action;
[return int;]
}
举个栗子:
#!/bin/bash
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
结果:
-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----
------------------------------------------------------------------------------------------------
2. 返回值
#!/bin/bash
fun(){
函数体
return 返回值
}
fun
echo $?
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
函数参数
举个栗子:
#!/bin/bash
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 5 2 3 4 5 6 7 8 9 34 73
结果:
第一个参数为 5 !
第二个参数为 2 !
第十个参数为 50 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 5 2 3 4 5 6 7 8 9 34 73 !
read控制台输入
read 选项 参数 -t -p
-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
-p 后面跟提示信息,即在输入前打印提示信息。
-e 在输入的时候可以使用命令补全功能。
-n 后跟一个数字,定义输入文本的长度,很实用。
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间。
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。
-----------------------
echo -e "\n输入超时" -e \n 换行输出
shell工具cut,sed,awk
cut 切割 --complement 选项提取指定字段之外的列
-c 字符
cut -d " " -f 2,3 text5.sh 选取第2列与第3列
echo $PATH|cut -d ":" -f 2- 选取第二列以后的值
-------------------------
sed
sed -e '2d' -e 's/wo/ni/g' text6.sh -e 多个命令
sed 'nd' 删除
sed ''
-------------
awk NF 返回每一行有多少列
awk [options] 'BEGIN{ commands } pattern{ commands } END{ commands }' file
其中options表示awk的可选的命令行选项,其中最常用的恐怕是 -F 它指定将文件中每一行分隔成列的分隔符号。而紧接着后面的单引号里面的所有内容是awk的程序脚本,awk需要对文件每一行分割后的每一列做处理。file则是awk要处理的文件名称。
-------------------------------------------------------------------------------------
-v var=value or --asign var=value 为用户定义的变量赋值
-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-v var=value or --asign var=value
赋值一个用户定义变量。
-f scripfile or --file scriptfile
从脚本文件中读取awk命令。
-mf nnn and -mr nnn
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
-W compact or --compat, -W traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
-W copyleft or --copyleft, -W copyright or --copyright
打印简短的版权信息。
-W help or --help, -W usage or --usage
打印全部awk选项和每个选项的简短说明。
-W lint or --lint
打印不能向传统unix平台移植的结构的警告。
-W lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告。
-W posix
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
-W re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
-W source program-text or --source program-text
使用program-text作为源代码,可与-f命令混用。
-W version or --version
打印bug报告信息的版本。
----------------------------------------------------------------------------------------
awk '{pattern + action}' {filenames}
#尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
#awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
----------------
三种格式分别是:
awk 'pattern' filename
awk '{action}' filename
awk 'pattern {action}' filename
-------------------
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
$NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数
----------------------------------------
awk '/内容/' 文件名 查找文件中含有指定内容的行
awk -F: 'NR==2{print "filename: "FILENAME, $0}' /etc/passwd 打印文件第二行的内容
awk -F '|' '$1~/.sh/{print $1}' text5.sh 第一个位置等于.sh
awk -F ":" '{print $NF}' /etc/passwd 查最后一列的内容 $ NF
awk -F "|" '{if(NR<6 && NR >3) print $1}' text5.sh 第3到6行的内容,不包括边界 等于写到大于小于右面
awk -F "[| o e]" '{print $1}' text5.sh []多分隔符
awk '/^$/{print NR}' text5.sh 空行所在行号 /^$/
BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
awk -F: 'BEGIN{print "name, shell"} {print $1,$NF} END{print "hello world"}'
awk 'BEGIN{sum=0}{sum+=$1}END{print sum}' test.txt 对第一列求和
awk -F " " '{sum+=$2} END{print sum}'
awk '{if($1%2==0)print $1" "$2" "$3}' test.txt 判断
awk 'BEGIN{count=0;while(count<5){print count;count ++;}}' 循环
awk -v x=$a -v y=$b 'BEGIN{print x" "y}' 为变量赋值
awk '{OFS="#"}{print $1,$2,$3}' text6.sh 指定段分隔符
NF可以去掉空行
也可以写成 awk -v OFS='#' '{print $2 $3}'
awk '{if($0 != "") {print $0}}' a1.sh 去空行 grep -v '^$' NF
awk内置函数
算术:
atan2(y,x) 返回 y/x 的反正切。
cos(x) 返回 x 的余弦;x 是弧度。
sin(x) 返回 x 的正弦;x 是弧度。
exp(x) 返回 x 幂函数。
log(x) 返回 x 的自然对数。
sqrt(x) 返回 x 平方根。
int(x) 返回 x 的截断至整数的值。
rand() 返回任意数字 n,其中 0 <= n < 1。
srand([expr]) 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。
字符串:
gsub(reg,str1,str2) 使用str1替换所有str2中符合正则表达式reg的子串
sub(reg,str1,str2) 含义与gsub相同,只不过gsub是替换所有匹配,sub只替换第一个匹配
index(str,substr) 返回substr在str中第一次出现的索引,注意索引从1开始计算,如果没有则返回0
length(str) 返回str字符串的长度,length函数还可以返回数组元素的个数
blength(str) 返回字符串的字节数
match(str,reg) 与index函数一样,只不过reg使用正则表达式,例如match("hello",/lo/)
split(str,array,reg)将str分隔成数组保存到array中,分隔使用正则reg,或者字符串都可以,返回数组长度
tolower(str) 转换为小写
toupper(str) 转换为大写
substr(str,start,length) 截取字符串,从start索引开始的length个字符,如不指定length则截取到末尾,索引从1开始
其他:
system(command) 执行系统命令,返回退出码
mktime( YYYY MM dd HH MM ss[ DST]) 生成时间格式
strftime(format,timestamp) 格式化时间输出,将时间戳转换为时间字符串
systime() 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数
awk变量
说明:[A][N][P][G]表示支持该变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk
$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
$0 这个变量包含执行过程中当前行的文本内容。
[N] ARGC 命令行参数的数目。
[G] ARGIND 命令行中当前文件的位置(从0开始算)。
[N] ARGV 包含命令行参数的数组。
[G] CONVFMT 数字转换格式(默认值为%.6g)。
[P] ENVIRON 环境变量关联数组。
[N] ERRNO 最后一个系统错误的描述。
[G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。
[A] FILENAME 当前输入文件的名。
[P] FNR 同NR,但相对于当前文件。
[A] FS 字段分隔符(默认是任何空格)。
[G] IGNORECASE 如果为真,则进行忽略大小写的匹配。
[A] NF 表示字段数,在执行过程中对应于当前的字段数。
[A] NR 表示记录数,在执行过程中对应于当前的行号。
[A] OFMT 数字的输出格式(默认值是%.6g)。
[A] OFS 输出字段分隔符(默认值是一个空格)。
[A] ORS 输出记录分隔符(默认值是一个换行符)。
[A] RS 记录分隔符(默认是一个换行符)。
[N] RSTART 由match函数所匹配的字符串的第一个位置。
[N] RLENGTH 由match函数所匹配的字符串的长度。
[N] SUBSEP 数组下标分隔符(默认值是34)。
sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
选项 说明
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列
-------------------------
sort -t : -nrk 3 sort.sh 按照“:”分割后的第三列倒序排序
输出
printf "%s*%s=%2s " $i $j `expr $i \* $j`
%s占位符 %2s表示输出时占两位,右对齐
没有自动换行。
%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
举个栗子:
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
------------------------------------------------------------------------------------------------
print 中不能使用%s ,%d 或%c;
自动换行
printf转译序列
序列 | 说明 |
---|
\a | 警告字符,通常为ASCII的BEL字符 |
\b | 后退 |
\c | 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 |
\f | 换页(formfeed) |
\n | 换行 |
\r | 回车(Carriage return) |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 一个字面上的反斜杠字符 |
\ddd | 表示1到3位数八进制值的字符。仅在格式字符串中有效 |
\0ddd | 表示1到3位的八进制值字符 |
数组
定义
nums=(29 100 13 8 91 44) 定长
arry=() arry[0]=22 不定长
----------------
echo ${nums[0]} 获取数据中的值
------------------
${#array_name[@]} 获取数组的长度
${#array_name[*]} ---------- echo ${#a[1]} 获取数组中某一位的长度
---------------------
举个栗子:
shell {0..500..7} 表示从0到500是7的倍数的输出