带你真正认识Linux 系统结构:https://www.linuxprobe.com/linux-system-structure.html
head -2 test.txt
tail -2 test.txt
head -4 test.txt|tail -2
wc -l test.txt#查看行数
wc -w test.txt#查看单词
wc -c test.txt#查看字符
动态查看系统的整体运行
Linux下文件的权限类型一般包括读,写,执行。对应字母为 r(4)、w(2)、x(1)。
Linux下权限的属组有 拥有者(u) 、群组(g) 、其它组(o) 三种。每个文件都可以针对这三个属组(粒度),设置不同的rwx(读写执行)权限。
-rw------- (600) 只有拥有者有读写权限。
-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。
chmod +x abc:给所有用户添加执行的权限
chmod a+r abc:给所有用户添加读的权限
chmod -R 777 abc:给文件夹和子文件的所有用户赋予读写执行权限
shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。
目前主要有下列版本的shell。
Bourne Shell:是贝尔实验室开发的。
BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,大部分linux的发行套件使用的都是这种shell。
Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。
C Shell:是SUN公司Shell的BSD版本。
变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
使⽤()来定义数组变量,中间使⽤空格隔开
array=(1 2 3 4 5 6)
#读取数组元素
echo ${array[2]}
#读取整个数组
echo ${array[*]}
#或者
echo ${array[@]}
#取得数组单个元素的长度
echo ${#array[*]}
#或者
echo ${#array[@]}
#提取子字符串
string="runoob is a great site"
# 输出 unoo
echo ${string:1:4}
#获取字符串长度
echo ${#string}
#${#array[*]}和${#array[@]}表⽰数组中元素的个数
#字符串拼接--将两个字符串并排放在一起就能实现拼接
name="Shell"
url="http://www.baidu.com/shell/"
#**中间不能有空格**($name $url)
str1=$name$url
str2="$name $url" #如果被双引号包围,那么中间可以有空格
str3=$name": "$url #中间可以出现别的字符串
str4="$name: $url" #这样写也可以
str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
unset var
Shell 和其他编程语言一样,支持多种运算符,包括:
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
注意:条件表达式要放在中括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 |
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n “$a” ] 返回 true。 |
$ | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
文件测试运算符用于检测 Unix 文件的各种属性。
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
#单行语句一般要用到分号来区分代码块
#若写作多行,用换行符来区分代码块,则无需用到分号
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。
case … esac 语法格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
示例:
#!/bin/sh
site="runoob"
case "$site" in
"runoob") echo "菜鸟教程"
;;
"google") echo "Google 搜索"
;;
"taobao") echo "淘宝网"
;;
esac
for((i=0;i<10;i++));
do
echo $i ;
done
⽤于迭代数组,还可以迭代以空格隔开的字符串序列。或者是某个命令的返回值。
for f in $array[*];
do
…
done
#示例:
ss="aa bb cc dd";for x in $ss;do echo $x ;done
for x in \`ls\` ;do echo $x ;done
ss=(aa bb cc "sss dd");for x in "${ss[@]}";do echo $x ;done
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。
#语法格式为:
while condition
do
command
done
#实例1
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
#let 命令的替代表示形式是: ((算术表达式))
#实例2
echo '按下 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
#语法格式为:
until condition
do
command
done
#实例
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
#expr整数运算
Shell 中的 break 和 continue 却能够跳出多层循环,也就是说,内层循环中的 break n和 continue n 能够跳出外层循环。
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
# return后跟数值n(0-255),返回的是状态码
[ function ] funname [()]
{
action;
[return int;]
}
#!/bin/bash
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
#注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
#大小写不同意义不同
grep -A
grep -B
grep -C
#忽略大小写
grep -i
#查看压缩文件
zgrep
zcat
awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本
-F fs or –field-separator fs
如果不加-F指定,则以空格或者tab为分隔符
指定输入文件折分隔符,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报告信息的版本。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-laeo2aKc-1649323121090)(https://boostnote.io/api/teams/dlm1ZMj21/files/b45453d37e548ff9bb2f84babebb2a28ad8c021c3e76dd578c2fb65a13108fff-1089507-20170126222420597-662074402.jpg)]
#分割。
last -n 5 |awk '{print $1}'
awk -F":" '{ print $1 }' /etc/passwd
awk -F":" '{ print $1 $3 }' /etc/passwd
awk -F":" '{ print $1 " " $3 }' /etc/passwd
awk -F":" '{ print "username: " $1 "\t\tuid:" $3" }' /etc/passwd
#赋值一个用户定义变量-v。
#log.txt文本内容如下:
#2 this is a test
#3 Are you like awk
#This's a test
#10 There are orange,apple,mongo
$ awk -va=1 '{print $1,$1+a}' awktest.txt
$ awk -va=1 -vb=s '{print $1,$1+a,$1b}' awktest.txt
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
&& | 逻辑与 |
~ 和 !~ | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ – | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
#过滤第一列大于2的行:
$ awk '$1>2' log.txt #命令
#过滤第一列大于2并且第二列等于’Are’的行:
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' awktest.txt
变量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 一条记录的字段的数目 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出字段分隔符,默认值与输入字段分隔符一致。 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
# 输出顺序号 NR, 匹配文本行号
awk '{print NR,FNR,$1,$2,$3}' awktest.txt
# 指定输出分割符
awk '{print $1,$2,$5}' OFS=" $ " awktest.txt
# 输出第二列包含 "th",并打印第二列与第四列
awk '$2 ~ /th/ {print $2,$4}' awktest.txt
#'~,!~'表示指定变量与正则表达式匹配(代字号)或不匹配(代字号、感叹号)的条件语句
awk参考资料
sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑
在命令行指定sed指令对文本进行处理:sed +选项 ‘指令’ 文件
先将sed指令保存到文件中,将该文件作为参数进行调用:sed +选项 -f 包含sed指令的文件 文件
-r:使用扩展正则表达式
-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
-f:后跟保存了sed指令的文件
-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
a:追加 向匹配行后面插入内容
c:更改 更改匹配行的内容
i:插入 向匹配行前插入内容
d:删除 删除匹配的内容
s:替换 替换掉匹配的内容
p:打印 打印出匹配的内容,通常与-n选项和用
示例1:向文件中添加或插入行
sed '3ahello' sedtest.txt #向第三行后面添加hello,3表示行号
sed '/123/ahello' sedtest.txt #向内容123后面添加hello,如果文件中有多行包括123,则每一行后面都会添加
示例2:更改文件中指定的行
sed '1chello' sedtest.txt #将文件1.txt的第一行替换为hello
sed '/123/chello' sedtest.txt #将包含123的行替换为hello
示例3:删除文件中的行
sed '4d' sedtest.txt #删除第四行
sed '1,2d' sedtest.txt #删除1~2行
sed '/123\|abc/!d' sedtest.txt #删除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反
示例4:替换文件中的内容
sed 's/123/hello/' sedtest.txt #将文件中的123替换为hello,默认只替换每行第一个123
sed 's/123/hello/g' sedtest.txt #将文本中所有的123都替换为hello
示例5:打印文件中的行
sed -n '3p' sedtest.txt #打印文件中的第三行内容
sed -n '3,$p' sedtest.txt #打印从第3行到最后一行的内容
sed -n '/123/p' sedtest.txt #逐行读取文件,打印匹配you的行
示例6:修改文件中的行并生效
sed -i '/123/ahello' sedtest.txt