文章目录
一些常用指令
chgrp、chown、chmod
# 修改用户群组
sudo chgrp jydr conpot.log
# 修改文件拥有者
sudo chown jydr conpot.log
# 修改文件权限
sudo chmod +rwx conpot.log
chattr
+a 只能最加数据,不能删除和修改
+i 不能做任何修改,删除
# 添加隐藏权限,不可删除,改名,写入,新增数据
chattr +i pi.txt
# 查看
lsattr
# 取消隐藏权限
chattr -i pi.txt
strace
查看一个进程代码走到了哪里,会附加上进程
sudo strace -p 1963
ipcs 查看系统所有IPC
ipcs -a
第七章:linux磁盘与文件系统
lsblk 列出磁盘列表
[jydr@localhost ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 59G 0 part
├─centos-root 253:0 0 38.3G 0 lvm /
├─centos-swap 253:1 0 2G 0 lvm [SWAP]
└─centos-home 253:2 0 18.7G 0 lvm /home
sr0 11:0 1 4.4G 0 rom /run/media/jydr/CentOS 7 x86_64
常用指令
[jydr@localhost ~]$ lsblk -ip
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sda 8:0 0 60G 0 disk
|-/dev/sda1 8:1 0 1G 0 part /boot
`-/dev/sda2 8:2 0 59G 0 part
|-/dev/mapper/centos-root 253:0 0 38.3G 0 lvm /
|-/dev/mapper/centos-swap 253:1 0 2G 0 lvm [SWAP]
`-/dev/mapper/centos-home 253:2 0 18.7G 0 lvm /home
/dev/sr0 11:0 1 4.4G 0 rom /run/media/jydr/CentOS 7 x8
blkid 列出设备的UUID
[root@localhost jydr]# blkid
/dev/sda1: UUID="37938f55-01c2-49eb-88bb-cbf039746623" TYPE="xfs"
/dev/sda2: UUID="SmANR3-in1v-A1ND-Ebjm-q8U4-2SH9-uGpCjI" TYPE="LVM2_member"
/dev/sr0: UUID="2019-09-11-18-50-31-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/mapper/centos-root: UUID="31bb1ab3-f271-4858-b950-5a0485f01f9f" TYPE="xfs"
/dev/mapper/centos-swap: UUID="4c96e741-4c5b-4dc2-ab47-7f9086a2a592" TYPE="swap"
/dev/mapper/centos-home: UUID="bb68d111-d409-4bea-be9a-35fd1c7ed3be" TYPE="xfs"
df 列出磁盘容量信息
[root@localhost jydr]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 893M 0 893M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 39G 4.3G 34G 12% /
/dev/sda1 1014M 238M 777M 24% /boot
/dev/mapper/centos-home 19G 73M 19G 1% /home
tmpfs 182M 28K 182M 1% /run/user/1000
/dev/sr0 4.4G 4.4G 0 100% /run/media/jydr/CentOS 7 x86_64
parted 列出磁盘分区表与分区信息
[root@localhost jydr]# parted /dev/sda print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 64.4GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system 标志
1 1049kB 1075MB 1074MB primary xfs 启动
2 1075MB 64.4GB 63.3GB primary lvm
gdisk GPT分区
[root@jydr ~]# gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): ?
b back up GPT data to a file
c change a partition's name
……………………
之后按问号查询操作指令,常用的如下面的图片
查看设备信息
# 按p打印出设备信息
Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 5C229E8F-FD87-4239-AE5D-501A1FBDE72B
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 18862013 sectors (9.0 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 6143 2.0 MiB EF02
2 6144 2103295 1024.0 MiB 0700
3 2103296 65026047 30.0 GiB 8E00
给磁盘进行不同类型的分区
Command (? for help): n
Partition number (5-128, default 5):
First sector (34-83886046, default = 67123200) or {+-}size{KMGTP}:
Last sector (67123200-83886046, default = 83886046) or {+-}size{KMGTP}: +1g
Current type is 'Linux filesystem'
# 分区类型:8300-Linux 0700-MSbasic 8200-swap
Hex code or GUID (L to show codes, Enter = 8300): 0700
Changed type of partition to 'Microsoft basic data'
# 分区完毕后查看是否正确
Command (? for help): p
Disk /dev/sda: 83886080 sectors, 40.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 5C229E8F-FD87-4239-AE5D-501A1FBDE72B
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 83886046
Partitions will be aligned on 2048-sector boundaries
Total free space is 13619133 sectors (6.5 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 6143 2.0 MiB EF02
2 6144 2103295 1024.0 MiB 0700
3 2103296 65026047 30.0 GiB 8E00
4 65026048 67123199 1024.0 MiB 8300 Linux filesystem
5 67123200 69220351 1024.0 MiB 0700 Microsoft basic data
6 69220352 70268927 512.0 MiB 8200 Linux swap
# 写入分区
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
# 确定分区
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
查看是否分区
[root@jydr ~]# cat /proc/partitions
major minor #blocks name
8 0 41943040 sda
8 1 2048 sda1
8 2 1048576 sda2
8 3 31461376 sda3
11 0 4554752 sr0
253 0 10485760 dm-0
253 1 1048576 dm-1
253 2 5242880 dm-2
partprobe 更新linux核心的分区表信息
[root@jydr ~]# partprobe -s
/dev/sda: gpt partitions 1 2 3 4 5 6
Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only.
/dev/sr0: msdos partitions 2
# 重新查看!
[root@jydr ~]# cat /proc/partitions
major minor #blocks name
8 0 41943040 sda
8 1 2048 sda1
8 2 1048576 sda2
8 3 31461376 sda3
8 4 1048576 sda4
8 5 1048576 sda5
8 6 524288 sda6
11 0 4554752 sr0
253 0 10485760 dm-0
253 1 1048576 dm-1
253 2 5242880 dm-2
第十章 bash
alias 自定义指令
alias lm='ls -la'
type 查看指令属于什么类型
root@K-ON:~# type ls
ls is aliased to `ls --color=auto'
root@K-ON:~# type cd
cd is a shell builtin
root@K-ON:~# type -t cd
builtin
root@K-ON:~# type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
ls is /bin/ls
shell命令行快捷操作 ctrl+a
whatprovides 查找指令
# 比如查找lsusb指令
yum whatprovides */lsusb
RANDOM 随机数
# 打印出0-9的数字,其他数字自己设定
declare -i number=$RANDOM*10/32767; echo $number
locale 语系和修改语系
# 查看当前 ;查看所有
locale ; locale -a
# 修改语系
LANG=zh_CN.utf8; LC_ALL=zh_CN.utf8; locale
# debian和ubuntu修改默认语系 /etc/default/locale
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
#LANG="zh_CN.UTF-8"
#LANGUAGE="zh_CN:zh"
# 然后加载资源source /etc/default/locale
read 用法
declare 宣告
ulimit 限制在444页,10.2.7
unset 取消变量
${:}变量删除
$ {PAGE:-more}的意思是:如果shell变量PAGE已经定义,且其值非空,则使用其值,否则使用字符串more
path=$PATH
# 删除第一个冒号之前 ##注意冒号位置可以用任意字符表示!!!
jydr@jydr:~$ echo ${path#/*:}
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
# 删除最后一个冒号之前
jydr@jydr:~$ echo ${path##/*:}
/snap/bin
# 倒着删除第一个冒号之前
jydr@jydr:~$ echo ${path%:*bin}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
# 倒着删除最后一个冒号之前
jydr@jydr:~$ echo ${path%%:*bin}
/usr/local/sbin
# 删除;号前面的数据,最后一个;时用##
buf="58834;qoweruds"
echo ${buf#*;}
# 删除;号后面的数据,第一个分号时用%%
echo ${buf%;*}
变量取代 448页
# 取代第一个
jydr@jydr:~$ echo ${path/sbin/SBBB}
/usr/local/SBBB:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
# 取代所有字符
jydr@jydr:~$ echo ${path//bin/SBBB}
/usr/local/sSBBB:/usr/local/SBBB:/usr/sSBBB:/usr/SBBB:/sSBBB:/SBBB:/usr/games:/usr/local/games:/snap/SBBB
alias 命令别名
alias hg='history | grep'
alias lm='ls -al | more'
# 如果要让命令永远有效,编辑家目录的 .bashrc
unalias 取消命令别名
umalias lm
重导向
# 把标准输出导入垃圾桶
find / -name .bash > /dev/null
# 把标准错误导入垃圾桶
find / -name .bash 2> /dev/null
find / -name .bash 2>> /dev/null
# 把正确和错误都写入同一个文件
find / -name .bash &> /dev/null
find / -name .bash > /dev/null 2>&1
# 由键盘输入内容到 heihei文件
cat > heihei.md
# 由文件取代键盘输入
cat > heihei < ~/.bashrc
# 设置中止字符 heihei
cat > heihei << heihei
; && || |
make; make install
; 表示互不依赖,会依次执行
&& 表示第一个执行完毕且成功,第二个才会执行
|| 表示第一个成功执行,就没有必要执行第二个了
| 管道命令,后面接命令,接受标准输出
sort 排序
# 默认用英文头字母排序
cat /etc/passwd | sort
# 以:为分隔符,第三列用数字排序,不用数字排序就不加-n
cat /etc/passwd | sort -t ':' -k 3 -n
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# 排序并去除同样的数据
last | cut -d ' ' -f1 | sort | uniq -c
cut、grep 过滤信息
cut -d '节点字符' -f 4
# 比如过滤cpu的空闲率信息
[jydr@jydr ~]$ top -n 1 | grep Cpu | cut -d ',' -f 4 | cut -d ' ' -f 2
68.8
wc 列数行数、字数、字符数
# 行数 字数 字符数 ==》 -l -w - m
[root@jydr ~]# cat /etc/man_db.conf | wc
131 723 5171
tee 双重重定向
# 把last内容存在txt文件中 同时输出到屏幕
last | tee last.txt
# tee默认是覆盖文件,-a 的叠加内容
last | cut -d ' ' -f1 | tee -a last.txt
tr 删除和替换字符
# 替换输出中所有j 为 J
last | tr j J
# 删除输出中所有冒号
last | tr -d ':'
空闲率信息
[jydr@jydr ~]$ top -n 1 | grep Cpu | cut -d ',' -f 4 | cut -d ' ' -f 2
68.8
col
# 将tab转换为空格 cat -A 显示特殊字符
col -x
paste
# 对两个文件每行拼接 ,默认用tab拼接
paste file1 file2
# 用字符拼接
paste -d file1 file2
expand
# 将tab 换为空格 指定书目
last | expand -t 6 | cat -A
split
裁剪文件为几部分的命令,483页
第十一章 正则匹配与文件格式化处理
- [:alnum:] 大小写字母和数字
- [:alpha:] 大小写字母
- [:upper:] 大写字母
- [:lower:] 小写字母
- [:digit:] 数字
grep 进阶
# -n 显示行号
jydr@jydr:~$ ifconfig ens33 | grep inet6 -n
3: inet6 fe80::b482:4b43:ac40:83cc prefixlen 64 scopeid 0x20<link>
# -A 显示出后面两行
jydr@jydr:~$ ifconfig ens33 | grep inet6 -A 2
inet6 fe80::b482:4b43:ac40:83cc prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:df:a5:09 txqueuelen 1000 (以太网)
RX packets 250908 bytes 343929343 (343.9 MB)
# -B显示出前面两行
jydr@jydr:~$ ifconfig ens33 | grep inet6 -B 2
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.23.140 netmask 255.255.255.0 broadcast 192.168.23.255
inet6 fe80::b482:4b43:ac40:83cc prefixlen 64 scopeid 0x20<link>
# -v 反向选择,下列筛选出没有字符 the 的所有行
grep -vn the bird.txt
# -i 不区分大小写
grep -in the bird.txt
8:I can't finish the test.
9:Oh! The soup taste good.
正则表示法
# 连续挨着6个数字才匹配
echo $str | grep '[0-9]\{6\}'
asd234312sdf2423234sf32
# [] 多字符兼容匹配 搜索 tast 和 test ; 获取有数字的行
grep -n t[ae]st bird.txt
grep -n [0-9] bird.txt ==> grep -n [[:digit:]] bird.txt
# [^] 排除匹配,比如 oo 前面不能有 g; 排除oo前面是小写字母的
grep -n [^g]oo bird.txt
grep -n [^a-z]oo bird.txt
# ^ 匹配行首的字符
grep -n ^the bird.txt
grep -n ^[a-z] bird.txt
# 匹配开头非英文字母
grep -n ^[^a-zA-Z] bird.txt
# $ 匹配行尾为小数点的行
grep -n '\.$' bird.txt
# 搜索空行
grep -n ^$ bird.txt
# 打印行尾 ! 的行
grep -n '!$' bird.txt
13:Oh! My god!
19:goooooogle yes!
# 利用^$ ^#删除空白行和注释行,注意-n要放在最后一个管道的grep中
grep -v ^# /etc/rsyslog.conf | grep -vn ^$
# . 任意字符
grep -n g..d bird.txt
9:Oh! The soup taste good.
16:The world <Happy> is the same with "glad".
# * 0个或N个和前面字符重复的字符
o* # 可以是空字符和ooo……
oo* # 第一个字符必须是o,后面无数
# 匹配开头和结尾都是g的字符串
grep -n g.*g bird.txt
1:"Open Source" is a good mechanism to develop programs.
14:The gd software is a library for drafting programs.
18:google is the best tools for search keyword.
# 搜索任意数字的行列
grep -n [0-9][0-9]* bird.txt
5:However, this dress is about $ 3183 dollars.
15:You are the best is mean you are the no. 1.
# {} 限定范围,搜索有两个o的行……
grep -n 'o\{2\}' bird.txt
grep -n 'go\{2,5\}g' bird.txt
18:google is the best tools for search keyword.
grep -n 'go\{2,\}g' bird.txt
18:google is the best tools for search keyword.
19:goooooogle yes!
sed 工具
# nl 列出行号显示
nl bird.txt
# d 删除选定的行、到最后行
nl bird.txt | sed '5,10d'
nl bird.txt | sed '8,$d'
# a 添加行
nl bird.txt | sed '2a I am you father'
1 "Open Source" is a good mechanism to develop programs.
2 apple is my favorite food.
I am you father
# 增加多行行尾用 \
nl bird.txt | sed '2a I am you \
> heihei xixi'
# c 取代
nl bird.txt | sed '2,21c cancel 2-21 line'
1 "Open Source" is a good mechanism to develop programs.
cancel 2-21 line
# -n ?p 打印抓取的行
nl bird.txt | sed -n '5,7p'
5 However, this dress is about $ 3183 dollars.
6 GNU is free air not free beer.
7 Her hair is very beauty.
# 's/要查找的字符/要替换的字符/g' 查找取代
ifconfig ens33 | grep inet | sed 's/^.*inet //g'
192.168.23.140 netmask 255.255.255.0 broadcast 192.168.23.255
ifconfig ens33 | grep inet | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'
192.168.23.140
# 组合模式 比如 删除特殊行 ‘//d’
cat man.txt | grep MAN | sed '/^#/d'
# 直接替换文件内容, . 替换 !
sed -i 's/\.$/\!/g' bird.txt
# 在最后一行添加内容
sed -i '$a MMM WWW' bird.txt
# 在sed中使用变量
sed -i "s|${num}|haha|g" xx.xx
# 重点注意,sed在执行抓取n,p命令后,替换或插入行时若要保留原格式,制表符/t等,需要在操作符号后面加'\',否则制表符会被清空
sed "${num}a\ $data" xx.xx
sed "${num}c\ $data" xx.xx
延申正则表示法 egrep
# 化繁为简 grep -v ^# /etc/rsyslog.conf | grep -v ^$
egrep -v '^$|^#' /etc/rsyslog.conf
# + 一个或无穷个的重复字符 o oo ooo oooo...
egrep 'go+g' bird.txt
google is the best tools for search keyword!
goooooogle yes!
# ? 一个或者0个
egrep 'go?d' bird.txt
Oh! My god!
The gd software is a library for drafting programs.!
# * 是0个到无穷个 + 加 ? 等于 * # !!!
# | 'gd|good' 在一个选项里建立管道
# () 并列群组 列入搜索glad和good
egrep 'g(la|oo)d' bird.txt
# ()+ 搜索重复的字符串 xyz
echo "AxyzxyzxyzB"| egrep 'A(xyz)+B'
文件格式处理
printf
在自制shell中输出有用
# 整齐排列,数字代表n个空格 ,s字符,i整数,f浮点数
printf '%10s %6i %6i %8.2f \n' $(cat cjd.txt | grep -v name)
xiaoming 65 55 89.00
xhong 59 75 88.00
fang 89 76 64.00
awk
# 筛选出第一列和第四列 并用tab隔开
cat cjd.txt | awk '{print $1 "\t" $3}'
# 打印出行数
cat cjd.txt |awk '{print "lines:"NR " "$1 "\t" $3}'
# 打印ID小于10的行,只要第一第三列
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3}'
root:x:0:0:root:/root:/bin/bash
daemon 1
bin 2
# 上面第一行无效,BEGIN初始化第一行
cat /etc/passwd | awk 'BEGIN{FS=":"} $3 < 10 {print $1 "\t" $3}'
root 0
daemon 1
diff 对比文件
# 正常对比,过滤加-bBi
diff bird.txt of.txt
# 用标准输出 - 代替目标文件
cat bird.txt | diff - ddif.txt
cmp 对比字节
# 对比字节,默认只输出第一个不同的字节
cmp bird.txt ddif.txt
# -l 输出所有不同的字节
cmp -l bird.txt ddif.txt
patch 打补丁
517页
# 生成补丁
diff a.txt b.txt > xx.diff
# 应用补丁, 其中0表示当前目录,xx.diff文件引用目录时可以./1/2/3...
patch -p0 < xx.diff
第十二章 shell script
shell 10-8-16进制转换
10进制转16进制:15 > 0xf
printf '%x\n' 15
16进制转10进制:0xf > 15
printf '%d\n' 0xF
echo $((16#f))
16进制转8进制:0xF > 17
printf '%o\n' 0xF
8进制转10进制:8#17 > 15
echo $((8#17))
2进制转10进制:2#1111 > 15
echo $((2#1111))
date 日期
# 显示时间和日期
date +%F\ %T
2021-03-16 20:52:07
$(( )) 变量运算
# 第一种定义整型运算
declare -i str=${num}*${index}
# 推荐使用$(())
echo $((5*8/2))
# 自增变量
((++i))
bc 计算小数点
# 有多少小数点就显示多少位
echo '1.5*1.5' | bc
2.2
echo '1.5*1.55' | bc
2.32
source 执行脚本
# sh bash 执行不需要可执行权限,只需要读权限
sh tt.sh
# 在父shell上执行脚本,变量也会继承
source tt.sh
test 测试指令
查询指令在533页,
或者直接用 man test
man test
# 判断一个文件存在与否
test -e /home/jydr/cjd.txt && echo "yes" || echo "no"
练习脚本
#!/bin/bash
# 输入文件名
read -p "Please input a filename: " fname
# 判断输入字符是否为空
test -z $fname && echo "You must input a filename." && exit 0
# 判断文件是否存在
test ! -e $fname && echo "\"${fname}\" do not exist!" && exit 0
# 判断是文件还是目录
test -f $fname && ftype="regulare file"
test -d $fname && ftype="directory"
echo "${fname} is ${ftype}"
# 判断文件属性
test -r $fname && at="readable"
test -w $fname && at="$at writable"
test -x $fname && at="$at executable"
echo "$fname attribute: $at"
[ ] 判断符号
注意要变量与符号和[ ] 之间都要有一个空格
#!/bin/bash
while true
do
read -p "Please input \"y/n\" : " yn
# 是y的时候就输出并退出
[ "$yn" == "y" -o "$yn" == "Y" ] && echo "OK! over!" && exit 0
# 是n的时候就输出并退出
[ "$yn" == "n" -o "$yn" == "N" ] && echo "NO! error!" && exit 0
# 提示后重新输入
echo "Input error. Please input again!"
done
$0 $1 $@ $# $* 脚本参数
$@ 基本与 $* 相同 用前者即可代表参数列表
#!/bin/bash
# $0 第0个参数,也是运行的脚本名
echo "The script name is : $0"
# $# 参数的数量
echo "parameter number is : $#"
[ $# -lt 2 ] && echo "Parameter is less 2, exit!" && exit 0
# $@ 打印全部参数
echo "Whole parameter is : $@"
# $1 $2 参数1 参数2....
echo "The 1st parameter : $1"
echo "The 2st parameter : $2"
# 运行结果如下
jydr@K-ON:~$ ./yy.sh a b c
The script name is : ./yy.sh
parameter number is : 3
Whole parameter is : a b c
The 1st parameter : a
The 2st parameter : b
- 加 shift 可对变量进行偏移
shift 偏移一个参数
shift 3 偏移三个参数
if 条件判断式
多重条件可以选择
# 多重条件可以选择
if [ ] || [ ]; then
fi
计算现在到飞升日期的天数
#!/bin/bash
# 计算当前与飞升日期的时间差
read -p "Please input Feisheng data (YYYYMMDD ex>20210310): " fdate
ndate=$(echo $fdate | grep '[0-9]\{8\}')
if [ -z $ndate ]; then
echo "Format error!"
exit 0
fi
# 飞升日期
ddate=$(date --date="$fdate" +%s)
# 现在的日期
ndate=$(date +%s)
# 两个日期的差值
let fdate=$ddate-$ndate
# 将秒数转化为天
let fdate=$fdate/60/60/24
# 打印
echo "Distance Feisheng days: "$fdate
case…in…esac 多项选定
根据输入的参数判断打印输出
#!/bin/bash
case ${1} in
"a")
echo "A:ba ge ya lu!";;
"b")
echo "B:ku lu ya lu!";;
"c")
echo "C:a ni ga duo!";;
*)
echo "Hello World!";;
esac
function 函数
可加关键字function,也可以不加
#!/bin/bash
function mydraw(){
[ -z $1 ] && echo "No parameters!" && exit 0
case $1 in
"a")
echo "A: I am is A!";;
"b")
echo "B: I am is B!";;
"b")
echo "C: I am is C!";;
esac
}
read -p "Please input a/b/c: " cha
mydraw $cha
while、for循环
# 正向模式
while []
do
done
# 反向模式
until []
do
done
# for 循环
for $var in var1 var2 var3
do
done
利用until计算1+2+3+…+100的和
#!/bin/bash
num=0
sum=0
until [ $num -gt 100 ]
do
echo "hahahahahahah!"
let sum+=$num
let num+=1
done
echo "sum value is: $sum"
# 使用for循环来实现
#!/bin/bash
sum=0
for num in $(seq 1 100)
# 上一行也可写成for num in {1..100}
do
let sum+=$num
done
echo "sum value is: $sum"
#!/bin/bash
sum=0
for ((i=1; i<=100; i++))
do
let sum+=$i
done
echo "sum value is: $sum"
# 选择吃饭地点
#!/bin/bash
eat[1]="第一森林"
eat[2]="五芳斋"
eat[3]="木桶饭"
eat[4]="食堂自助"
eat[5]="港式烧腊"
eat[6]="烤鱼"
eat[7]="陕老顺"
eat[8]="牛肉面馆"
eat[9]="命运石之门"
eatnum=9
for i in {1..9}
do
index=$(( $RANDOM * $eatnum /32767 + 1 ))
echo "现在我们去${eat[$index]}吃饭饭!"
done
script的检测与查看
# -n 检测有无语法错误,无则不显示
sh -n tt.sh
# -x 列出所有执行过的代码行和输出结果
sh -x tt.sh
+ echo Hello World!
Hello World!
练习列子
1、计算世界线收束日期
#!/bin/bash
# 命运石月
steins_m=10
# 命运石日
steins_d=08
# 命运石年
steins_y=
# 命运石之日
steins_t=
# 下面计算距离每年的世界线收束时期
if [ $(date +%m) -lt $steins_m ]; then
steins_y=$(date +%Y)
steins_t=${steins_y}${steins_m}${steins_d}
elif [ $(date +%m) -eq $steins_m ] && [ $(date +%d) -le $steins_d ]; then
steins_y=$(date +%Y)
steins_t=${steins_y}${steins_m}${steins_d}
else
let steins_y=$(date +%Y)+1
steins_t=${steins_y}${steins_m}${steins_d}
fi
today=$(date +%s)
steins_s=$(date --date=$steins_t +%s)
let steins_gate=($steins_s-$today)/60/60/24
echo $steins_t
echo $steins_s
echo "距离世界线收束日期还有 $steins_gate 天!"
2、输入一个数,计算1到这个数的累加值
#!/bin/bash
read -p "Please input a maximum number: " mnum
sum=0
for i in $(seq 1 $mnum)
do
let sum+=i
done
echo "累加值为:"$sum
3、读取linux用户名,并打印出来
#!/bin/bash
users=$(cat /etc/passwd | cut -d ':' -f1)
j=0
for i in $users
do
let j+=1
echo "第$j个用户名为$i"
done
第八章 压缩打包与备份
tar 打包压缩解压
- -j bzip2压缩
- -z gzip压缩
- -J xz压缩
- -c 打包
- -x 解包
- -v 显示过程
- -f 设置档名
- -p 保留权限与属性
# 打包并压缩成gzip
tar -zcvf filename.tar.gz [要打包的文件或目录]
# 解包解压缩
tar -zxvf filename.tar.gz
# 备份 /etc 目录
tar -zpcvf /root/etc.tar.gz /etc
# time 可以观察命令运行的时间
time tar -jpcvf /root/etc.tar.bz2 /etc
# -P 大P选项会保留绝对路径,上面的备份的案列都是去除了根目录的,如果加上P解压时,就会覆盖原目录,所以要注意。
# -C 指定解包目录
tar -zxvf filename.tar.gz -C /tmp
只解压包里面的某一个文件
–exclude 打包时不包含某一或某些文件
dd 创建与备份
- if=FILE read from FILE instead of stdin
- of=FILE write to FILE instead of stdout
- bs=BYTES read and write up to BYTES bytes at a time (default: 512);
- count=N copy only N input blocks
# 备份一个文件
dd if=/etc/passwd of=/tmp/haha.txt
# 直接操作设备
dd if=/dev/zero of=/dev/sdb bs=1M count=10240
# 备份/boot CentOS7下/boot一般为/dev/sda2
dd if=/dev/sda2 of=/tmp/boot.img
cpio 备份用这个
第九章 vim 使用技巧
1、移动搜寻
Ctrl + f 向下翻页
Ctrl + b 向上翻页
Ctrl + d 向下半页
Ctrl + u 向上半页
+ 移动到下一行的开头
- 移动到上一行的开头
H 光标移动上屏幕最上方首字符
M 光标移动上屏幕中央首字符
H 光标移动上屏幕最下方首字符
gg 回到首行
G 移动到尾行
nG 移动到n行
n<Enter> 向下移动n行
/<char> 向下搜索
?<char> 向上搜索
n 向下继续搜索
N 向上继续搜索
:n1,n2s/char/content/g 替换n1到n2行之间的字符
:%s/char/content/g 替换所有该字符 (常用)
:%s/char/content/gc 替换所有字符但是会有确认提示 (常用)
2、删除复制粘贴返回撤销
nx 删除光标向后的n个字符
d1G 删除光标行到第一行的所有数据
dG 删除当前行到最后一行的所有数据
gg + dG 删除整个文档数据
d0 删除光标到行首的数据
d$ 删除光标到行尾的数据
dw 仅删除一个单词
yy 复制系列与dd删除系列指令完全一样
p 在光标下一行粘贴数据
P 在光标上一行粘贴数据
J 将当前行和下一行结合成一行
u 撤销,类似ctrlt+z
ctrl+r 恢复上一步操作,类似ctrl+y
. 小数点是重复上一步指令的意思,连续按连续执行
3、编辑插入
i 在光标前一个字符插入
a 在光标前一个字符插入
I 在当前行首插入
A 在当前行尾插入
o,O 在下一行插入和在上一行插入
r 取代光标所在的那一个字符
R 从光标开始取代,直到按ESC键退出取代
4、指令模式
ZZ 保存后退出(好用)
:wq :x :wq! 都是保存退出
:w filename 另存为某文件
:r filename 读取文件内容到光标之后
:n1,n2 w filename 将n1到n2行的数据存入文件
:!<shell commands> 暂离vi使用shell命令
:set nu 全内容显示行号
:set nonu 取消显示行号
5、vim高级功能
1~4的功能都是vi拥有的,接下来是vim的
选择
v 选择
ctrl+v 选择区域 (好用)
y 将选中的地方复制
d 将选中的地方删除
p 粘贴
多文件编辑
多文件编辑好处是可以文件之间复制粘贴
vim file1 file2 file3
:n 下一个文件
:N 上一个文件
:files 查看文件列表
:sp 开启多个窗口
:sp filename 开启另一个窗口
ctrl+w+up/down(j/k)可以切换窗口
字符串补全
补全是在编辑模式下
ctrl+x -> ctrl+n 补全单词的来源当前编辑的文件(常用)
ctrl+x -> ctrl+f 补全单词的来源当前目录的文明名
ctrl+x -> ctrl+o 以扩展名区分,用vim内置的单词补全 (常用)
DOS 和 Linux 断行符
^M$ 是CR + LF 也就是\r\n
$ 是LF \n
将linux上有^M$的文件替换成$
第一种方法安装dos2unix 转换
第二种方法只用如下指令,^M 符号不是两个字符 而且按ctrl+v+m 按出来的
sed -i 's/^M//g' dos.txt
语系编码转换
# 查看文件属于什么语系
file file.txt
# 列出所有编码
iconv --list
# window平台的文件大多是gbk 或者gb2312
iconv -f <原编码> -t <需转换的编码> filename -o output_newfile
# 实列
iconv -f gbk -t utf8 dos.txt -o newdos.txt
man 查询使用
# 首先查询本身,查看每种类型代表的详细信息
man man
# -f有多个说明文件的指令
man -f man
man (1) - 在线参考手册的接口
man (7) - macros to format man pages
# 根据数字查询特定文件
man 7 man
# 根据关键字查询
man -k man
第十三章 账号管理与权限设定
/etc/passwd 记录用户账号的文件
/etc/shadow 记录用户密码的文件
/etc/passwd 文件
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
……
- 第一列 账号名
- 第二列 密码,现在统一为x,密码存在了/etc/shadow文件中
- 第三列 UID root账户为0 系统账户1-200 201-999用户创建的系统账号,1000之后用户账号
- 第四列 GID
- 第五列 用户
- 第六列 该用户的家目录
- 第七列 该用户调用的Shell
/etc/shadow 文件
root:!:18601:0:99999:7:::
daemon:*:18480:0:99999:7:::
bin:*:18480:0:99999:7:::
……
jydr:$6$7fopFfPF$oZMCcXAprQlqJMO3LdoqLgh6iLojAObmFMtcNFAcxF01942GiMbKTktqq3Rj3luE10eXWIzYm4Xc2vBG4nALw1:18601:0:99999:7:::
- 第一列 账号
- 第二列 加密后的密码
- 第三列 最近更改密码的日期,距离1970-01-01号的天数
- 第四列 与第三列参照,不可更改密码的天数,0是随时可以更改
- 第五列 密码需要重新更改的天数,不改则过期
- 第六列 密码需要更改期限前的警告天数
- 第七列 密码过期后可以宽限使用的天数
- 第八列 账号失效日期
- 篡改root密码
- 重启系统进入单人维护模式修改root密码
- 忘记密码可以使用usbCD挂载硬盘,清空root密码
groups 查看当前用户属于哪些群组
第一个是有效群组,新建文件后该文件的群组就是有效群组
newgrp 切换当前用户的有效群组
jydr@jydr:~$ newgrp dip
jydr@jydr:~$ touch scrish
jydr@jydr:~$ ll scrish
-rw-r--r-- 1 jydr dip 0 3月 22 08:16 scrish
/etc/gshadow
root:*::
daemon:*::
bin:*::
jydr:!::
sambashare:!::jydr
👼 1、组名
👼 2、密码栏,为!的表示无合法密码,所以无群组管理员
👼 3、群组管理员的账号
👼 4、加入该群组支持的所属账号