Linux命令行与shell脚本编程大全-读书笔记
2019-06-03 10:02:24 2 举报
AI智能生成
Linux常用命令与shell编程-读书笔记和日常所用命令总结
作者其他创作
大纲/内容
Linux常用命令与shell编程
服务等简单命令
软件包是否安装:which software1(通用)rpm -qa|grep software1yun list software1(redhat、centos发行版)apt-cache show software1(ubuntu发行版)
查看发行版:cat /etc/redhat-release(redhat)lsb_release -a(suse等)cat /etc/issue(suse)
查看内核版本:uname -acat /proc/version
端口是否监听:netstat -anp|grep 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
显示长列表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\" ……
长列表格式内容
文件的权限
访问权限
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
登陆用户名
用户密码
用户账户的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(管理账户有效期)
文件属组的组名
groupadd
groupmod(-g:GID;-n:组名)
文件的大小(以字节为单位)
文件的上次修改时间(stat可查看三个时间参数a|m|ctime)
查看访问时间:加参数--time=atime(修改-a)
修改文件的修改时间:touch -t YYMMDDhhmm(.ss)
状态修改时间
文件名或目录名
简单处理
复制:cp(单点符.表示当前目录.;-R递归复制
链接(虚拟副本,指向文件真实位置的占位符)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
排序: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_ipftp>get file
scp(secure)
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-commonsudo 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
:%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
命令输出给变量test1=·date· or test1=$(date)
expr
v3 = $(expr $v2 / $1)v3 = $(($v2 / $v1))v3 = $[$v2 / $v1]
退出响应码:echo $?
结构化命令
if command1 then commands elif command2then more commandselse commandsfi
test命令if test $v1 orif [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
for var in listdo commandsdone
一直保持最后一次迭代的值,除非修改
var中有空格,用双引号
内部字段分隔符:IFS=$'\:;'
while test commanddo other commandsdone
until test commandsdo other commandsdone
处理用户输入与输出
$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:STDIN1:STDOUT2:STDERR
脚本中的重定向:临时(加&)—ls -a>&2(STDOUT>STDERROR>STDOUT),永久 exec 2>test|exec 0<testfile从文本中读取数据
阻止命令输出, null文件位置:/dev/null
关闭文件描述符:exec 3>&-
创建函数
function name{commands} orname(){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 -f t1.sed data1.txt
cat t1.seds/test/test1/s/is/one is/
flags(s/pattern/replacement/flags)
数字,替换第几次模式匹配的地方
g:替换全部匹配的文本
p:将原先行的内容打印出来(常和-n(禁止sed编辑器输出)一起使用——只输出被替换命令修改过的行) sed -n 's/test/test1/p' data2.txt
w:将替换的结果写入文件中
/路径名 sed 's/\\/bin\\/bash/\\/bin\\/csh/' /etc/passwd
sed 's!bin/bash!/bin/csh!' /etc/passwd
行寻址
文本模式:sed '/Rich/s/bash/csh/' /etc/passwd
删除d
sed '/number 1/d' data4.txt
使用两个文本模式删除时,第一个“打开”行删除功能,第二个会“关闭”行删除功能,匹配不上“关闭”模式,会将剩余行全部删除
插入i
echo \"This line 2\"|sed 'i\\This line 1'
sed '3i\\>This is an inserted line.' data6.txt
sed '3i\\>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
修改c
sed '3c\\>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
读取r
sed '3r data1.txt' data2.txt(将data1.txt的数据插入data2.txt的第三行后)
多行命令
N(将数据流中的下一行加进来创建一个多行组来处理)
例:双词短语匹配,两处匹配,其中一个换行sed '>s/A\B/A1\B1/>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}
gawk 'BEGIN {print \"The file3 Contents:\"}>{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次或多次
|管道
()分组
例:echo$PATH |sed 's/:/ /g'
在线Linux环境:https://www.masswerk.at/jsuix/index.html参考书籍:《Linux命令行与shell脚本编程大全(第3版)》附:部分命令适用于Redhat、cgsl、suse、Ubuntu等发布版本,当前环境无法演示
收藏
0 条评论
回复 删除
下一页