Linux命令行与shell脚本编程大全-读书笔记
2019-06-03 10:02:24 2 举报
AI智能生成
Linux常用命令与shell编程-读书笔记和日常所用命令总结
作者其他创作
大纲/内容
服务等简单命令
软件包是否安装:
which software1(通用)
rpm -qa|grep software1
yun list software1(redhat、centos发行版)
apt-cache show software1(ubuntu发行版)
which software1(通用)
rpm -qa|grep software1
yun list software1(redhat、centos发行版)
apt-cache show software1(ubuntu发行版)
服务(是否)开启,如ftp功能:
service vsftpd status|start
netstat -an|grep 21
service vsftpd status|start
netstat -an|grep 21
查看发行版:
cat /etc/redhat-release(redhat)
lsb_release -a(suse等)
cat /etc/issue(suse)
cat /etc/redhat-release(redhat)
lsb_release -a(suse等)
cat /etc/issue(suse)
查看内核版本:
uname -a
cat /proc/version
uname -a
cat /proc/version
端口是否监听:netstat -anp|grep port
lsof -i:port
lsof -i:port
开启监听端口:nc -lp port &(测试端口被占用场景)
设置防火墙:iptables
文件|目录
显示
[guest@www.masswerk.at:2]$ ll
-rw-rw---- 1 guest users 27 2019/05/18 22:42:38 data1.txt
-rw-rw---- 1 guest users 27 2019/05/18 22:42:38 data1.txt
显示长列表ls -l,是否用了alias(内部命令,永久化:$HOME/.bashrc)?
验证:
[guest@www.masswerk.at:2]$ alias
……
ll ls -l
……
[guest@www.masswerk.at:2]$ cat /etc/profile
#!/bin/sh
……
alias -s ll "ls -l"
……
验证:
[guest@www.masswerk.at:2]$ alias
……
ll ls -l
……
[guest@www.masswerk.at:2]$ cat /etc/profile
#!/bin/sh
……
alias -s ll "ls -l"
……
长列表格式内容
文件类型,比如目录(d),文件(-)、字符型文件(c)或块设备(b)
文件的权限
访问权限
r-对象可读
w-对象可写
x-对象可执行
安全级别
对象的属主
guest可读写该文件
对象的属组
users可读写该文件
系统其它用户
其它用户无权限
权限码
---:000:0:没有任何权限
--x:001:1:只有执行权限
-w-:010:2:只有写入权限
-wx:011:3:有写入和执行权限
r--:100:4:只有读取权限
r-x:101:5:有读取和执行权限
rw-:110:6:有读取和写入权限
rwx:111:7:有全部权限
改变权限chmod [ugoa][[+-=][rwxXstugo...]]
第一组字符
u-用户
g-组
o-其它
a-上述所有
第二组字符
+:增加权限
-:移除权限
=:将权限设置为后面的值
第三组字符
X:如果对象是目录或者它已有执行权限,赋予执行权限
s:运行时重新设置UID或GID
t:保留文件或目录
u:将权限设置为跟属主一样
g:将权限设置为跟数组一样
o:将权限设置为跟其他用户一样
改变所属关系chown owner[.group] file
文件的硬链接总数
文件属主的用户名
系统账户(/etc/passwd)
[guest@www.masswerk.at:2]$ cat /etc/passwd
root:*:0:1:root:/root:/bin/sh
guest:*:101:2:guest:/home/guest:/bin/sh
[guest@www.masswerk.at:2]$ cat /etc/passwd
root:*:0:1:root:/root:/bin/sh
guest:*:101:2:guest:/home/guest:/bin/sh
登陆用户名
用户密码
用户账户的UID
用户账户的组ID(GID)
用户账户的文本描述(称为备注字段)
用户HOME目录的位置
用户的默认shell
常用命令
创建UID为1001,dba组的user1:useradd -g dba -u 1001 -m -d /home/user1 user1
删除用户:userdel -r user1
修改用户
usermod
-l:修改用户账户的登录名
-p;修改账户的密码
-L:锁定账户
-U:解锁账户
其他参数与useradd一样,如-g修改默认的登录组
passwd、chpasswd(userid:passwd,大量账户修改密码)
chsh(默认用户登录的shell)、chfn(finger备注)、chage(管理账户有效期)
文件属组的组名
[guest@www.masswerk.at:2]$ cat /etc/group
system:0:root
users:2:guest
wheel:1:root,guest
system:0:root
users:2:guest
wheel:1:root,guest
常用命令
groupadd
groupmod(-g:GID;-n:组名)
文件的大小(以字节为单位)
文件的上次修改时间(stat可查看三个时间参数a|m|ctime)
查看访问时间:加参数--time=atime(修改-a)
修改文件的修改时间:touch -t YYMMDDhhmm(.ss)
状态修改时间
文件名或目录名
简单处理
复制:cp(单点符.表示当前目录.;-R递归复制
链接(虚拟副本,指向文件真实位置的占位符)
readlink -f /path1/ 查看链接文件的最后一环
readlink -f /path1/ 查看链接文件的最后一环
符号链接(ln -s)
文件大小与数据文件不同,较小;ls -i|stat查看inode编号。是不同的文件
硬链接(ln )
文件大小与数据文件大小相同;文件相同
查找:find / -name file| find / -name directory -type d( \*消除*在shell中的特殊含义)
查看:cat 、more、less、tail、head
只输入cat时,从STDIN接受输入,输入一行,显示一行
监测磁盘空间
du -h
du -sh *(某个特定目录)
未释放文件占用磁盘空间:lsof -n
|grep deleted | awk '{print $2}'|xargs kill -9
|grep deleted | awk '{print $2}'|xargs kill -9
排序:sort(如sort -t ':' -k 3 -n /etc/passwd,-r降序)
搜索:grep
-c:匹配的行数
-e多模式
-v :反向
-i:不区分大小写
正则
压缩
tar -cvf a.tar test/
compress、zip、gzip等
解压
tar -xvf a.tar
unzip -o a.zip
文件传输
ftp hostname|dest_ip
ftp>get file
ftp>get file
scp(secure)
scp -p user2@ip2:file2 /path1/ (-p保留文件属性,远程-本地)
scp -p file user2@ip2:/path2/ 本地-远程
scp -r user2@ip2:file2 /path1/file1 file2复制,重命名为file1,-r递归复制
rsync -avz user2@ip2:/path1/ /path2/ 压缩,速度快
vim编辑器
Ubuntu默认安装vim版本 tiny和common,导致回车和方向键失效
sudo apt-get remove vim-common
sudo apt-get install vim
sudo apt-get remove vim-common
sudo apt-get install vim
快捷键
gg:第一行
G:最后一行
n G:第n行
h:左移一个字符
j:下移一行
k:上移一行
l:右移一行
u:撤销前一次编辑命令
dd:删除当前行 ndd:删除当前行开始的n行
A;当前行行尾追加
a:当前追加数据
x:删除当前所在未知的字符 nx:删除当前开始的n个字符
查找和替换
/查找,n下一个匹配
:/s/old/new/g 替换一行中的所有old
:n,ms/old/new/g 替换n和m之间的所有old
:%s/old/new/g 替换整个文件的所有old
文件编码
iconv test.txt -f GBK -t UTF-8 -o test2.txt
创建临时文件
mktemp testing.XXXXXX (6个字符码替换6X,指定文件名模板即可)
shell编程
环境变量
全局环境变量:env/printenv(不排序)
局部环境变量:set(全局、局部和用户定义变量)
删除环境变量:unset va1
系统环境变量
$HOME/.bash_profile
$PATH
$HOME/.bashrc(通常由其他文件运行)
Tips
同行显示消息:
echo -n "The date is "
date
echo -n "The date is "
date
命令输出给变量
test1=·date· or test1=$(date)
test1=·date· or test1=$(date)
重定向:wc <test2 行数、次数、字节数
输出>,追加>>,输入>,内联输入<<,文本标记开始和结束,如EOF
输出>,追加>>,输入>,内联输入<<,文本标记开始和结束,如EOF
expr
v3 = $(expr $v2 / $1)
v3 = $(($v2 / $v1))
v3 = $[$v2 / $v1]
v3 = $(($v2 / $v1))
v3 = $[$v2 / $v1]
退出响应码:echo $?
结构化命令
if command1
then
commands
elif command2
then
more commands
else
commands
fi
then
commands
elif command2
then
more commands
else
commands
fi
test命令
if test $v1 or
if [condition]
if test $v1 or
if [condition]
数值比较
-gt、-ge、-eq、-le、-lt、-ne
字符串比较
<、>(转义\)、= 、!=、-n、-z
文件比较
-e、-f、-d、-r、-w、-s、-x、-O、-G、-nt、-ot
break、continue
case $v in
p1 | p2)commands1;;
p3) commands2;;
*) default commands3;;
esac
p1 | p2)commands1;;
p3) commands2;;
*) default commands3;;
esac
for var in list
do
commands
done
do
commands
done
一直保持最后一次迭代的值,除非修改
var中有空格,用双引号
内部字段分隔符:IFS=$'\n:;'
while test command
do
other commands
done
do
other commands
done
until test commands
do
other commands
done
do
other commands
done
处理用户输入与输出
位置参数:$0:程序名,$1~$9,${10}...
$0为完整路径时,可用basename取不包含路径的脚本名
参数统计:$#
所有参数:
$*:整体;$@:独立的单词
$*:整体;$@:独立的单词
移动参数:shift
getopt ab:cd -a -b test1 -cd test2 test3
getopts :ab:c opt
read -t 5-p "Please enter your value: " age
标准文件描述符
0:STDIN
1:STDOUT
2:STDERR
1:STDOUT
2:STDERR
默认情况下,Linux会将STDERR导向STDOUT(ls -al empty 2 >test,test为空,STDERR打印在屏幕上,
其中&> 将STDOUT和STDERR重定向到同一个文件,默认STDERR优先级大于STDOUT)
其中&> 将STDOUT和STDERR重定向到同一个文件,默认STDERR优先级大于STDOUT)
脚本中的重定向:临时(加&)—ls -a>&2(STDOUT>STDERROR>STDOUT),永久 exec 2>test|exec 0<testfile从文本中读取数据
,但如果在运行脚本时重定向了STDERR,所有导向STDERR的文本都将被重定向
./test.sh 2>test3 屏幕只打印STDOUT,STDERR在test3中,适用于定时任务中,在脚本中生成错误信息
./test.sh 2>test3 屏幕只打印STDOUT,STDERR在test3中,适用于定时任务中,在脚本中生成错误信息
lsof -a(AND) -p(PID) $$(当前PID) -d(文件描述符编号) 0,1,2
阻止命令输出, null文件位置:/dev/null
关闭文件描述符:exec 3>&-
创建函数
function name{
commands
} or
name(){
commands
}
commands
} or
name(){
commands
}
sed编辑器
功能
一次从输入中读取一行数据
根据所提供的编辑器命令匹配数据
按照命令修改流中的数据
将新的数据输出到STDOUT
语法(sed options script file)
替换s
echo "This is a test"|sed 's/test/big test/'
sed -e 's/test/test1/,s/is/one is/' data1.txt
sed -e '
>s/test/test1/
>s/is/one is/' data1.txt
>s/test/test1/
>s/is/one is/' data1.txt
sed -f t1.sed data1.txt
cat t1.sed
s/test/test1/
s/is/one is/
s/test/test1/
s/is/one is/
flags(s/pattern/replacement/flags)
数字,替换第几次模式匹配的地方
g:替换全部匹配的文本
p:将原先行的内容打印出来(常和-n(禁止sed编辑器输出)一起使用——只输出被替换命令修改过的行)
sed -n 's/test/test1/p' data2.txt
sed -n 's/test/test1/p' data2.txt
注:单行的next(n),移动到下一文本行,不再重新回到命令的最开始执行,如 sed '/^$/d' data2.txt删除空行
sed '/header/{n ; d}' data2.txt
sed '/header/{n ; d}' data2.txt
w:将替换的结果写入文件中
/路径名 sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
sed 's!bin/bash!/bin/csh!' /etc/passwd
行寻址
数字:sed '2,$s/dog/cat/' data3.txt
文本模式:sed '/Rich/s/bash/csh/' /etc/passwd
删除d
sed '2,$d' data4.txt
sed '/number 1/d' data4.txt
sed '/1/,/3/d' data5.txt
使用两个文本模式删除时,第一个“打开”行删除功能,第二个会“关闭”行删除功能,匹配不上“关闭”模式,会将剩余行全部删除
插入i
echo "This line 2"|sed 'i\This line 1'
sed '3i\
>This is an inserted line.' data6.txt
>This is an inserted line.' data6.txt
sed '3i\
>This is an inserted line.\
>This is another line.' data6.txt
>This is an inserted line.\
>This is another line.' data6.txt
附加a
echo "This line 2"|sed 'a\This line 3'
sed '3a\
>This is an appended line.' data6.txt
>This is an appended line.' data6.txt
修改c
sed '3c\
>This is a changed line.' data6.txt(文本寻址同样适用)
>This is a changed line.' data6.txt(文本寻址同样适用)
转换y
sed 'y/123/678/' data8.txt
打印
p命令 echo "This is a test"|sed 'p'
=命令 sed '=' data2.txt(打印行号)
l列出行 sed -n 'l' data2.txt(可打印不可打印的ASCII字符,如\t)
写入w
sed '1,2w test.txt' data1.txt
读取r
sed '3r data1.txt' data2.txt(将data1.txt的数据插入data2.txt的第三行后)
多行命令
N(将数据流中的下一行加进来创建一个多行组来处理)
例:双词短语匹配,两处匹配,其中一个换行
sed '
>s/A\nB/A1\nB1/
>N
>s/A B/A1 B1/
>' data2.txt
sed '
>s/A\nB/A1\nB1/
>N
>s/A B/A1 B1/
>' data2.txt
N放在前面,最后一行匹配不到
D(删除多行中的一行)
sed '/^$/{N ;/header/D}' data.txt (删除第一行前的空白行)
P(打印多行中的一行)
。。。
gawk
功能
定义变量来保存数据
使用算术和字符串操作符来处理数据
使用结构化编程概念来为数据处理增加处理逻辑
通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告
语法(gawk options program file)
gawk '{print "Hello World"}'
未定义文件名,从STDIN接收数据,无论输入什么,显示固定的字符串“Hello World”
gawk -F: '{print $1}' /etc/passwd
自动给一行中的 每个元素分配变量:$0(整个文本行),$n(第n个数据字段)
echo "My name is Rich" |gawk '{$4="Haha"; print $0'}
gawk -F: -f script1.gawk /etc/passwd
cat script1.gawk
{
text="'s home directory is "
print $1 text $2
}
{
text="'s home directory is "
print $1 text $2
}
gawk 'BEGIN {print "The file3 Contents:"}
>{print $0}
>END {print "End of file"}' data3.txt
>{print $0}
>END {print "End of file"}' data3.txt
处理数据前后运行脚本
注:脚本中定义特殊变量FS,执行时无需添加-F:
正则表达式
特殊字符.*[]^${}+?|()
锚字符^和$:sed -n '/^this is a test$/p' test1.txt
点字符.匹配任意单个字符:sed -n '/.at/p' test1.txt
字符组[]:sed -n '/[Yy][Ee][Ss]/p' test2.txt
只匹配5位数的邮编sed -n '/^[0-9]{5}' text2.txt
? 0次或1次
+ 1次或多次
{} ,m:准确出现m次;m,n至少出现m次,至多n次
|管道
()分组
例:echo$PATH |sed 's/:/ /g'
在线Linux环境:https://www.masswerk.at/jsuix/index.html
参考书籍:《Linux命令行与shell脚本编程大全(第3版)》
附:部分命令适用于Redhat、cgsl、suse、Ubuntu等发布版本,当前环境无法演示
参考书籍:《Linux命令行与shell脚本编程大全(第3版)》
附:部分命令适用于Redhat、cgsl、suse、Ubuntu等发布版本,当前环境无法演示
0 条评论
下一页