Linux进阶之路

  https://github.com/blackplusy/0822python-

1.Linux的目录结构

linux下一切皆为文件
/      根目录   存放linux中所有文件
/bin    存放普通用户命令的位置
/boot   系统启动时需要的引导文件
/dev    存放系统硬件的位置
/etc    存放系统配置文件
/home   普通用户的家目录所在目录(当我们创建用户时候,默认会在/home里面创建一个和用户同名的目录作为该用户的家目录[用户登录时候默认所在的目录],即~)

/root      管理员的家目录/lib    存放系统库文件的位置
/mnt    系统默认挂载点
/opt    普通用户操作所在目录
/proc   存放系统当前运行信息的位置
/sbin   存放管理员命令的位置
/tmp    存放系统临时文件的位置
/var 存放系统运行信息(日志文件)

2.vim警告信息处理

在用vim打开一个文件时,其会产生一个cmd.swap文件,用于保存数据,当文件非正常关闭时,可用此文件来恢复,当正常关闭时,此文件会被删除,非正常关闭时,不会被删除,所以提示存在.swap文件。

解决方法如下:

方法1、此时你可以恢复文件:

vim -r nginx.conf

恢复以后把.swap文件删掉,在打开时就不会用提示良,注意.swap文件是个隐藏文件。可用:la查看。以.开头的是隐藏文件。

方法2、ls -a 查询隐藏文件

将后缀名为.swp的文件删除

rm -f .nginx.conf.swp

再次编辑文件不在出现提示警告!

1.单引号&双引号

单引号属于强引用,如需实现传参数,需要给参数再加一个单引号

双引号属于弱引用,双引号内的参数仍为参数,但弱存在$字符,则需要转义

由下面的例子不难看出,双引号是不会屏蔽对变量和某些特殊符号的转义的,而单引号里的所有内容都会原封不对的输出

,而单引号里再用单引号将变量引起来,变量就又可以正常的显示,有点像数学里的负负为正。

#!/bin/bash
for ((site=00;site<100;site++))
do
echo '<VirtualHost *:80>'
echo '  ServerAdmin     test@361way.com '
echo '  DocumentRoot    "d:/wwwroot/group/www.test'${site}'.com" '
echo '  ServerName      www.test'${site}'.com'
done
shell中单引号、双引号和两个双引号的区别,看下面的例子:
[root@test] a=55
[root@test] echo $a
55
[root@test] echo '$a'
$a
[root@test] echo ''$a''  #注意此处是两个单引不是一个双引
55

2.bash&dash

#!/bin/sh 与 #!/bin/bash别代表了dash 与 bash。dash 是Debian Linux 发行版的shell,然而许多Debian Linux发行版将bash shell用作普通用户登录。一个很奇怪的问题:Ubuntu linux发行版将bash shell用作默认的交互shell,但将dash shell用作默认的/bin/sh。

2.2. for (( i=0; i < $1; i++ )); do done 

2.bash支持这种类似C语言的循环,然而dash并不支持。dash会提示:Syntax error: Bad for loop variable

2.3.显示环境变量:dash 通过set,bash通过env。

2.4.let命令:只能用于bash,sh并不支持。

let  用于bash中执行数学运算,与expr类似。

2.5.有如下五种实现变量自加的运算,其中后三种只能在bash中使用

  8 #       A=$(($A+1))
  9 #       A=`expr $1 + 1`
 10 #       let A+=1               just suit in bash
 11 #       ((A++))                 just suit in bash
 12 #       A=$[$A+1]           just suit in bash      

2.6.RANDOW 变量只支持bash,不支持dash

用这个环境变量对26取模即可。
如果想得到1--68范围内的数 : $(($RANDOM%68+1 ))
如果想得到6--87范围内的数 : $(($RANDOM%82+6 ))

3.变量

变量名字和变量值都是自定义的,用户可以进行控制修改
a1.命名规则
    变量名可以有字母、数字、下划线组成,必须字母或下划线开头
    变量名产读不能超过255
    变量名在有效范围必须唯一
    在脚本中,某人类型都是字符串
a2.变量存储类型
    字符串类型,赋值时候单、双引号都可以
    整型
    浮点型
    日期型
a3.变量定义
    变量名=变量值
    注意:等号左右不能有空格
    a=10
    b=20
    c='heygor'
b.变量的调用
变量的调用通常作为输出,在变量名字前面增加$,进行打印即可
    a=20
    echo $a
    a='heygor'
    echo $a
d.变量的查看
可以查询当前系统运行的所有变量,包括系统变量和用户变量
    set
e.变量的删除
unset x     注意:unset并不是删除变量里面的值,而是删除变量,变量名前面不需要加$
    unset a
6.定义变量
定义变量通常2种方式
a.系统变量
系统变量可以用于定义shell的运行环境,环境变量可以在配置文件中进行定义和修改,也可以在命令行中设置,但是在命令行中设置重启终端后就会失效,最好在配置文件中进行修改(/etc/profile;~/.bashrc;~/.bash_profile),将环境变量放在配置文件中,每次登陆时后这些变量进行初始化
在.bashrc中最后一行添加 date | awk -F " " '{print $2,$3}',打开新终端后,直接显示日期
b.本地变量
在用户当前的shell生存其脚本使用
测试:打开终端设置变量输出,打开另外一个终端,显示变量输出
7.变量的赋值
1.直接赋值
等号左侧为变量名字,右侧为变量的值
a=20
a='heygor'
2.间接赋值
`` 反斜线代表先执行斜线中命令,然后把执行结果赋予变量
name=`hostname`
echo $name
ip=`ifconfig |grep inet`
echo $ip
3.交互赋值
read命令可以接受间哦按输入,并且赋值给变量
read -p "your name is : " username
echo $username
7.变量的位置参数进行赋值
通常脚本后面跟的第一个参数为$1,第二个参数为$2,以此类推
修改vim day-05.sh
findpath="$1"
find $findpath -name day-05.sh
执行
./day06 /home/heygor

修改vim day-06.sh
echo "第一个参数是 $1"
echo "第二个参数是 $2"
echo "第三个参数是 $3"

8.变量的运算
a.通过let方式
a=100
b=30
let c=a+b
echo $c
b.通过$()方式
a=20
b=30
c=$((a+b))
c.通过``方式
``先执行内部命令
now=`date | awk -F " " '{print $5}'`
echo $now

4.RANDOM

4.1.获取随机数字

[root@sftp01 test]# echo $RANDOM
28411
[root@sftp01 test]# echo $RANDOM
6371
[root@sftp01 test]# echo $RANDOM
1938

4.2.获取随机字符串

zelin@zelin-HP-EliteBook-8440p:/usr/bin$ echo $RANDOM | md5sum 
5a39ed59b2f80ffcfa1409d945de8d39  -
zelin@zelin-HP-EliteBook-8440p:/usr/bin$ echo $RANDOM | md5sum 
bf2c9e78f9548c61714db45f04fa01e0  -

4.3.获取范围内的随机值

#获取小于8的随机值(0-7)
zelin@zelin-HP-EliteBook-8440p:/usr/bin$ echo $(($RANDOM%8))
6

#获取3到10的随机值(3-(3+8-1))
zelin@zelin-HP-EliteBook-8440p:/usr/bin$ echo $(($RANDOM%8+3))
7

 

9.条件判断


shell编程中test命令,可以通过man test查看条件判断语法
条件判断在脚本中以if关键字开头fi关键字结尾,test等价与[]


a.单分支
if [ 条件 ];then
    执行语句
fi
b.双分支
if [ 条件 ];then
    执行语句
eles
    执行语句
fi
c.多分支
if [ 条件 ];then
    执行语句
elif [条件];then
    执行语句
...
else
    执行语句
fi
d.条件判断常见参数
    -f 是否存在(文件)
        test -f /etc/passwd
        如果条件成立,返回码是$?=0
        [ -f /etc/passwd ]
        [ -f /etc ]
    -e 不管是文件还是目录存在条件就成立
    -n 字符串为非空就是成立
    -z 字符床长度为0就成里
    字符串的对比 =   !=,不能用于数值大小的判断
    -eq 等于
    -ne 不等于
    -lt 小于
    -gt 大于
    -gte大于等于
    -lte 小于等于
    逻辑判断符号
    -a and(逻辑与) 同时满足条件
    -o or(逻辑或)  满足一个条件即可

zelin@zelin-HP-EliteBook-8440p:/opt$ test 1 -eq 1
zelin@zelin-HP-EliteBook-8440p:/opt$ echo $?
0

2.2文件/目录判断

 -f 是否存在(文件)
 -e 不管是文件还是目录存在条件就成立

zelin@zelin-HP-EliteBook-8440p:/opt$ ls
for.sh  python1.0  python.py  shell.sh  while.sh  yechao
zelin@zelin-HP-EliteBook-8440p:/opt$ test -f for.sh
zelin@zelin-HP-EliteBook-8440p:/opt$ echo $?
0

1.3字符串判断

    -n 字符串为非空就是成立
    -z 字符串长度为0就成立
    =字符串相同, !=字符串不相同(没有空格)不能用于数值大小的判断

zelin@zelin-HP-EliteBook-8440p:/opt$ test "aa" != "bb"
zelin@zelin-HP-EliteBook-8440p:/opt$ echo $?
0


#read -p "your name is " user
#echo $user
#if [ $user='heygor' ];then
#       echo 'creazy!!!!'
#fi
if [ -f /etc/passwd1 ];then
        echo 'file exxists!'
else
        echo 'mu zhao dao'
fi

ls /etc/dadsadsads
if [ $? = "0" ];then
        echo 'its your hostname'
else
        echo 'WTF'
fi
   

 

10.循环


a.for循环
for循环就是遍历,访问序列中每一个元素
for i in 1 2 3 4
do
    echo "no.$i"
done
echo "finished"

for i in `seq 10`
do
    useradd usera$i
done
for ((i=1;i<=10;i++))
do
        sudo userdel -r heyor$i
done
判断局域网中哪些IP可以用,哪些不可以用(写脚本)
b.while循环
while 条件
do
    执行语句
done

while TRUE
do
    执行语句
done

猜数字

rannum=$(($RANDOM%10)) #产生一个随机数
guest=100              #设置变量
echo $rannum           #提示

while [ "$guest" -ne "$rannum" ]
do
        read -p "guset num: " guest
done

echo "number is $rannum"

需求:每次提示大了或者小了

 

1.awk
文本的行处理工具
awk options file
查看ip地址
ifconfig ens33 |grep 255 |awk  -F ":" '{print $2}'|awk -F " " '{print $1}'
awk -F ":" '{print $1}'   /etc/passwd   打印文件的第一列
awk -F ":" '{print $1,$6}' /etc/passwd  打印文件的第一列和第六列
awk -F ":" '{print $1":"$6}' /etc/passwd打印文件第一列和第六列,用冒号分割

$1,$2......$N 表示第几列
 awk -F ":" '{print $1,$6}' /etc/passwd

$0            表示一整行
 awk -F ":" '{print $0}' /etc/passwd

$NF           表示最后一列
awk -F ":" '{print $NF}' /etc/passwd

NF          标识每行有多少列
head -1 /etc/passwd |awk -F ":" '{print NF}'

NR          标识当前行号
head -10 /etc/passwd |awk -F ":" '{print NR,$1}'

awk的关系操作符
==     等于
!=    不等于
>=      大于等于
<=      小于等于
<    小于
>    大于

awk的逻辑操作符
&&     逻辑与    真&&真==>真
||     逻辑或   假||假==>假
!     逻辑非
打印行号
awk -F ":" '{print NR}' /etc/passwd
打印第8行
awk -F ":" 'NR==8{print;exit}' /etc/passwd
打印字段数(列数)大于4的行
awk -F ":" 'NF>4{print}' /etc/passwd
打印第5行到第10行
awk -F ":" 'NR>=5&&NR<=10{print NR,$0}' /etc/passwd
打印UID在30-100范围内的用户名
awk -F ":" '$3>=30&&$3<=100{print $1,$3}' /etc/passwd

awk -F "分隔符" 'BEGIN{ 处理文件前执行的代码块 }{ 处理文件过程中执行的 }END{ 处理文件后执行的代码 }'
输出顶部增加' begin '
输出最后增加' finish '
//
awk -F ":" 'BEGIN{ print "begin yeah!" }{ print $1 }END{print "finish!!!"}' passwd
注意:如果内容太多,可以通过 |more来进行查看

打印文件最后一行的最后一列
tail -1 passwd  |awk -F ":" '{print $NF}'
awk -F ":" 'END{ print $NF }' passwd

打印字段数大于4的总行数
awk -F ":" 'NF>4{print}' /etc/passwd |wc -l
awk -F ":" 'BEGIN{ count=0 }NF>4{ count++ }END{ print count }' passwd

把AWK代码写入独立文件中执行
01.awk
BEGIN{
    FS=":"
    count=0
}
{
    if( NF>4 ){
        count++
    }
}
END{
    print count
}
执行时候使用 awk -f 01.awk passwd
12.sed
字段编辑和字段替换
删除指令 d 在查看时候屏蔽某些信息
删除所有行          sed -e 'd' mypass
删除第一行          sed -e '1d' mypass
删除1到3行        sed -e '1,3d' mypass
删除第1行和第3行     sed -e '1d;3d' mypass
删除包含root关键字的行  sed -e '/root/d' mypass
删除daemon开头的所有行  sed -e '/^daemon/d' mypass
删除bash结尾的所有行    sed -e '/bash$/d' mypass
删除所有空行            sed -e '/^$/d' mypass
删除所有以#开头的行     sed -e '/^#/d' mypass

打印所有行
sed -n -e '' mypass
sed -n -e 'p' mypass
打印第一行和第三行
sed -n -e '1p;3p' mypass
匹配管理员开的行打印
sed -n -e '/^root/p' mypass
匹配以nologin结尾的进行打印
sed -n -e '/nologin$/p' mypass

替换命令,显示、打印时候替换
每行搜到的第一个root关键字替换为admin
sed -e 's/root/admin/' mypass
每行找到所有n关键字替换为admin
sed -e 's/n/admin/g' mypass
只替换2-10行:为-
sed -e '2,10s/:/-/g' mypass

把结果保存到源文件中
sed -i '/^root/d' mypass

使用域进行定位
echo "28-08-2018"
echo "28-08-2018" |awk -F "-" '{print $3"-"$2"-"$1}'
echo "28-08-2018" |sed -r 's/(..)-(..)-(....)/\3-\1-\2/'
echo "come on,baby" |sed -r 's/(.*),(.*)/\2,\1/'
删除每行的第二个字符
cat test |sed -r 's/(.)(.)(.*)/\1\3/'
删除最后一个字符
echo "can you see me?" |sed -r 's/(.*)(.)/\1/'
删除倒数第二个字符
echo "can you see me?" |sed -r 's/(.*)(.)(.)/\1\3/'

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值