Linux基础

Linux

一、基础

01- 执行环境准备

常见的有三种:

1、云主机 (阿里云腾讯云)
2、无数据的PC(不推荐多系统混跑)
3、虚拟机(推荐) (在windows/mac上安装虚拟机) (可以随时让虚拟机停下来)

02- linux的版本分类

02.1 内核版本

版本号 由 主版本号、次版本号、末版本号 组成
如 5.0.15
(次版本号是奇数为开发版,偶数为稳定版)
https://www.kernel.org

02.2 发行版本

开源的,经常见到的发行版本有5种

02.2.1 RedHat Enterprise Linux
软件经过专业人员测试,有部分要收费

02.2.2 Fedora
通过组建社区来免费提供操作系统,没有专业测试,不稳定

02.2.3 CentOS
基于RedHat Enterprise 源代码编译的, 免费
(结合上面两个操作系统)

02.2.4 Debian
为linux定制了华丽的界面

02.2.5 Ubuntu
为linux定制了华丽的界面

02.3 内核和发行版本的区别:

内核版本安装完成后没有用户界面和软件,是提供硬件抽象层、硬盘以及文件系统控制的核心程序
(linux核心只有内核部分,安装完后,用户界面/软件都没有。内核是系统的心脏,是linux中最基层的代码)

发行版本是在内核的基础上加入了用户界面和各种软件的支持
(linux发行版,就是在内核的基础上,加入用户界面,各种软件的支持。比如CentOS、小红帽等等。在内核的基础上,开发不同应用程序,组成的一个完整的操作系统)

03- 虚拟机安装

推荐 安装VirtualBox虚拟机,然后在虚拟机中安装linux系统

04- 启动linux

登录的shell(终端)

图形终端
命令行终端
远程终端(SSH、VNC)

二、系统操作

05- 帮助命令

05.1 man 帮助

man + 命令名称

man ls

05.2 help 帮助

1、首先用type来检测命令是内部还是外部命令

type + 命令名称

如果显示 xx is a shell builtin , 这说明是内部命令

如果显示 xx is aliased to ls --color=auto , 这说明是外部命令

比如

type cd
cd is a shell builtin
说明 cd 是 内部 命令


type ls
ls is aliased to `ls --color=auto'
说明 ls 是 外部 命令
05.2.1 内部命令

help + 命令名称

help cd
05.2.2 外部命令

命令名称 --help

ls --help

05.3 info 帮助

info 命令名称

info ls

linux基本操作命令是命令行

06- ls命令

06.1 -r

r(reverse) 意为逆向(配合-l使用)

06.2 -rt

ls -l -r          `默认是按照文件名逆向显示的`
ls -l -r -t       `按照时间逆向显示`

06.3 -R

06.4 -a

ls -R        递归显示文件以及文件夹
ls -a        显示隐藏文件

07- cp

cp -v     显示复制的进度条
cp -p     复制时保留原有时间
cp -a     复制时保留原有所有属性 时间 属组属主 权限

08- 文本查看命令

08.1 cat

08.2 head

08.3 tail

cat 文件名              # 显示文件内容

head -行数 文件名       # head -5 fileA     显示文件前5行内容

tail -行数 文件名       # tail -5 fileA     显示文件最后5行内容

tail -f 文件名          # 当文件内容发生变化,同步更新 比如会实时刷新的日志文件

08.4 wc

wc -l 文件名            # 用来 查看文件行数

09- 打包压缩 和 解压缩

09.1 打包压缩

压缩---> 打包+压缩

打包是指将一大堆文件或目录变成一个总的文件
压缩则是将一个大的文件通过一些压缩算法变成一个小文件

09.1.1 先打包,后压缩

1). 打包命令 cvf

将dirA 打包为 dirA.tar

tar -cvf dirA.tar dirA

2). 压缩 分两种 gzip 或 bzip
gzip xxx.tar

gzip dirA.tar
09.1.2 直接打包并压缩

将dirA 压缩为dirA.tgz (tar.gz是tgz的简称)

tar -czvf dirA.tgz dirA/
tar -czvf dirA.tar.gz dirA/

将两个文件夹压缩成一个tgz

tar -czvf dirAB.tgz dirA/ dirB/

bzip打包压缩
tar -cjvf dirA.tbz2 dirA
tar -cjvf dirA.tar.bz2 dirA

09.2 解压缩

解包

tar -xvf dirB.tar -C ./dir      # -C 后面的./dir为 执行解的包放的位置

解压缩

tar -xzvf dirB.tgz -C ./B
tar -xjvf dirB.tar.bz2 ./B

10- 文本编译器vi

vim 是一个同vi向上兼容的文本编辑器

10.1 正常模式 normal mode

10.2 插入模式 insert mode

有以下从正常模式到插入模式的 进入方式

i			# 光标处的前一个字符进入
I			# 光标处的当行某个字符前进入

a 			# 光标处的下一个字符进入
A 			# 光标处的当行末尾字符后进入

o 			# 光标处的下一行进入
O 			# 光标处的上一行进入

10.3 命令模式 command mode

10.3.1 复制
yy  		复制当前行
5yy 		复制从当前开始的5行
y$ 			复制该行中从当前光标开始到结尾的字符
10.3.2 删除
dd  		删除当前行
5dd 		删除从当前开始的5行
d$  		删除该行中从当前光标开始到结尾的字符

x			删除光标所在的字符
r			按r后输入要替代的字符
10.3.3 光标移动
g			移动到文本第一行
G			移动到文本最后一行

^			移动到当前行最开头
$			移动到当前行最末尾

10.4 可视模式 visual mode

10.4.1 v 字符可视模式

以字符来选择

10.4.2 V 行可视模式

以行来选择

10.4.2 ctrl V 块可视模式

选的是上下对齐的块
适用于删除或增加一整块字符

1. 删除

按ctrl v
键盘上下左右选择要删的字符块
按 d
被选中的字符块就被删掉了

2. 增加

ctrl v
键盘上下移动光标 选择要添加字符块的行
按 I (也就是shift i)(光标指向被选字符块的首行首字符)
输入要增加的字符 (比如 output:)
按两次esc
被选中的字符块的每行前面就会加上刚才新增的字符

11- 用户和用户组管理及密码管理

11.1 用户

新建用户 useradd
删除用户 userdel
修改用户密码 passwd
修改用户属性 usermod
  1. usermod -d /new/work/directory username
    将username用户的家目录改为 /new/work/directory

  2. chage
    更改用户密码过期信息

  3. id username
    查看用户的 uid gid group

11.2 用户组

usermod -g 用户组1 用户1
将 用户1 的 组 改为 用户组1

su -
当前用户为root, 但要临时切换到普通用户下测试某功能,测试完成后恢复到原来的root用户

12- su

su 命令用来做 root和普通用户的相互切换 切换用户

切换到root : su 后面 可加 可不加 root
切换到tester : su 后面 必须加 tester

tester是举的一个普通用户的例子

12.1 普通用户 切换到 root

12.1.1 su
$ pwd    查看当前目录为 /home/tester

$ su     输入root用户密码

显示
# pwd    # 井号说明已经进入root用户了,  查看当前目录为 /home/tester


用 su 切换到了root 身份,但shell环境仍然是普通用户的shell
工作目录仍然是普通用户的工作目录

12.1.2 su -
$ pwd      查看当前目录为 /home/tester

$ su -     输入密码

显示
# pwd     # 井号说明已经进入root用户了,  查看当前目录为  /root

用 su - 切换到了root 身份,shell环境也切换到root的shell
工作目录变成了root的工作目录

12.2 root 切换到 普通用户tester

12.2.1 su
12.2.2 su -
# pwd       # 井号说明当前是root用户,  查看当前目录为 /root

# su tester     shell环境仍然是root,   查看当前目录为 /root

# su - tester   shell环境也切换到普通用户,  查看当前目录为 /home/tester

13- sudo

sudo 将某些只有root用户可以执行的命令授权给普通用户,普通用户就可以在不知道root密码时执行root指定的命令
sudo 是 以自己的身份执行其他用户的指令, 如以普通用户身份执行root用户的指令

比如 只有root用户才能执行关机操作,但如果希望普通用户也可以执行关机,两种方法

方法一: 告诉普通用户root的密码(不安全,不推荐)
方法二: 使用sudo 命令(推荐)

使用sudo 命令的操作方法

  1. 首先在root下配置哪些命令可以被哪些用户执行
    root用户下 执行visudo
    添加如下内容 来 赋予 普通用户1 的shutdown 命令

普通用户1 ALL=/sbin/shutdown

  1. 执行sudo 命令来 做被配置的root下的shutdown 命令
    sudo shutdown -h

14- 文件与目录权限的表示方法

0 123 456 789 xxxx xxxxxx xxxxxxxx
类型 <–权限–> 大小 时间 文件名

14.1 类型

  • 普通文件
    d 目录
    b 块特殊文件
    c 字符特殊文件
    l 符号链接
    f 命名管道
    s 套接字文件

14.2 权限

-rw-r-xr--. 1 tester tester   11 Jul  6 17:19 test.sh
权限一共占9个位数,所以用了1-9来表示位数

123 456 789
abc def ghi
权限

abc 文件属主的权限(用户的权限)
def 文件属组的权限(用户组的权限)
ghi 其他用户的权限(其他人的权限)

14.2.1 对于文件
r 读   r=4
w 写   w=2
x 执行 r=1

-rw-r-xr–. 1 tester tester 11 Jul 6 17:19 test.sh
即表示
属主权限为rw- ,数字表示为6, 属主有读和写权限
属组权限为r-x ,数字表示为5, 属组有读和执行权限
属主权限为r-- ,数字表示为4, 其他用户有读权限

notes
对于test.sh 文件,表示属主没有执行权限,属组有执行权限
经测试,属主不能执行
14.2.2 对于目录
x  进入目录
rx 显示目录内的文件名
wx 修改目录内的文件名

14.2 chmod

原文件 -rw-r-xr–. 1 tester tester 11 Jul 6 17:19 test.sh

chmod 修改文件、目录 权限
可以对权限进行 增加 减少 或 直接设置

用字符表示方法

u 对属主设置
g 对属组设置
o 对其他设置
> 对属主 增加执行权限 chmod u+x test.sh

> 对属组 减少执行权限 chmod g-x test.sh
 
> 对其他 设置为执行权限 chmod o=x test.sh
 
> 对属主 属组 其他 都增加读取权限 chmod a+r test.sh
  
> 对属主 属组 其他 都增加读写执行权限 chmod a+r+w+x test.sh
 
> 用数字表示方法  为所有属性 都增加读写执行权限 chmod 777 test.sh

14.3 chown

chown 来 修改属主(owner)、属组(group)

Examples:

  chown root /u        Change the owner of /u to "root".   将/u的 属主 更改为“root”
  chown :staff /u      Change the group of /u to  "staff".  将/u的 属组 更改为“staff”
  chown root:staff /u  Likewise, but also change its group to "staff".  将/u的 属主 更改为“root”, 也将其属组更改为“staff”
  chown -hR root /u    Change the owner of /u and subfiles to "root".  将/u和子文件的 属主更改为“root”

三、Shell

15- 什么是shell

shell是命令解释器,用于解释用户对操作系统的操作

shell把用户执行的命令翻译给内核, 内核根据命令执行的结果,再把结果反馈给用户

CentOS 7 默认使用的shell是bash

16- 执行脚本的不同方式

有一个内容如下的文件 /home_local/tester/testMethods.sh 来检测不同的执行方式的异同

#!/bin/sh
pwd

cd /home

16.1 bash filename.sh

在当前的终端上产生一个bash的子进程, 在子进程里执行脚本,执行完成后回到父进程
使用这种方式执行, 发现虽然没有执行权限, 但也可以执行

脚本中显示cd到了/home目录, 但是执行完成后又回到了原来的目录

执行
bash testMethods.sh

结果
/home_local/tester
/home

查看 pwd
/home_local/tester

16.2 ./filename.sh

产生子进程,用#! (Sha-Bang)来解释脚本
使用这种方式执行, 没有执行权限时是不能执行的

脚本中显示cd到了/home目录, 但是执行完成后又回到了原来的目录

先给脚本添加可执行的权限
chmod 777 testMethods.sh

执行
./testMethods.sh

结果
/home_local/tester
/home

查看 pwd
/home_local/tester

16.3 source ./filename.sh

在当前的进程中执行
虽然没有执行权限, 但也可以执行
脚本中显示cd到了/home目录, 最终当前目录是/home
会对当前环境造成影响

执行
source ./testMethods.sh

结果
/home_local/tester
/home

查看 pwd
/home

16.4 . filename.sh

在当前的进程中执行
虽然没有执行权限, 但也可以执行
脚本中显示cd到了/home目录, 最终当前目录是/home
会对当前环境造成影响

执行
. testMethods.sh

结果
/home_local/tester
/home

查看 pwd
/home

17- 管道

管道:用于进程通信

管道符 |
将前一个命令执行的结果传递给后面的命令

(将前一个命令的输出作为后一个命令的输入)
同时会为两个命令创建子进程

18- 重定向

将输出到 标准输出中的内容 输出到 文件

18.1 输入重定向

wc -l filename.sh  显示文件行数
wc -l  然后在页面中输入任意几行信息,按ctrl D 停止输入, 结果显示输入信息的行数
wc -l < filename.sh  显示文件行数, 用文件代替用户输入
输入
wc -l testMethods.sh

显示
6 testMethods.sh
输入
wc -l < testMethods.sh

显示
6

18.2 输出重定向

echo "xxx" > filename.sh        覆盖
echo "xxx" >> filename.sh       追加

18.3 错误输出重定向

18.3.1 输入一条不存在的命令 nocmd, 控制行下方显示错误
bash: nocmd: command not found…

18.3.2 将错误输出重定向到 err.txt
nocmd 2> err.txt

查看err.txt
cat err.txt
bash: nocmd: command not found…

18.4 输出(不管错误还是正确)重定向

nocommand &> all.txt

输出到标准输出的输出到文件

19- 变量

19.1 定义

有意义的变量名
不区分类型

19.2 变量赋值

为变量赋值的过程,称为变量替换

1) 变量名=变量值  [等号左右不能出现空格]
value=233

2) 使用let为变量赋值    [通常let用来计算]
let value=10+33

3) 将命令赋值给变量
通常是把命令的值赋给变量
l=ls


4) 将命令结果赋值给变量,使用$() 或``
let c=$(ls -l /etc)
let c=`ls -l /etc`

newed_file=`ls *.html -t | head -1`        # 取当前目录下最新的一个 *.html文件
bak_file="${newed_file%.*}_`date +"%y%m%d%H%M"`"  # 名字后加时间戳

5) 变量值有空格等特殊字符可以包含在 "" 或 ''string1="hello world"
string2='hello "world"'

19.3 变量的引用

${变量名} 也可以 $变量名

19.4 取变量值

echo ${变量名}
echo $变量名

19.5 变量的作用范围

变量的默认作用范围 只针对当前的shell(终端)有效

如果在当前的shell产生新的子shell,或者是当前shell的平行shell或父shell,都是无效的

step1: 举个例子 命令行中给一个变量赋值

demo_var=333

step2: 然后在一个脚本中调用该变量,并打印值
文件名 testDemo.sh

#!/bin/sh
echo demo_var=$demo_var

step3: 用两种在当前shell执行的执行方式来执行

source test07.sh        #执行结果       demo_var=333
. test07.sh             #执行结果       demo_var=333

可以获取到该变量的值

step4: 用两种会创建子进程的执行方式来执行

bash test07.sh          #执行结果       demo_var=
./test07.sh             #执行结果       demo_var=

发现并不能获取到该变量的值

改变变量的默认作用范围 用 export
export: 希望在子进程父进程以及其他shell中可以读到当前shell中定义的变量时, 使用export

在命令行中加上
export demo_var

step5: 加上export后 然后用两种会创建子进程的执行方式来执行

bash test07.sh          #执行结果       demo_var=333
./test07.sh             #执行结果       demo_var=333

可以获取到该变量的值

step6:当不使用变量了,可以对变量删除, 使用unset

unset demo_var

19.6 环境变量

把变量保存在系统中,使它成为环境变量

环境变量:每个shell打开都可以获取到的变量

1)现有的环境变量有哪些
用 env 查看

env
用echo $xxx 来输出值

2) 当前目录的搜索路径

echo $PATH

我们在执行 ls echo 这类命令时, 前面是没有带路径的,这些命令都没有在当前路径,
linux就是通过 $PATH 这个搜索路径来找的

输入
echo $PATH

显示
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin

3) 在原来的PATH路径上加上我们的当前目录 /home/tester

PATH=$PATH:/home/tester

就有当期的目录了,可以直接执行

test0717.sh

19.7 预定义变量

echo $?				# 上一条命令的执行结果(是否成功)
echo $$ 			# 显示进程的id号
echo $0				# 显示当前的进程名称

19.8 位置变量

为shell脚本添加参数

test0717.sh
如果第二个参数有值, 则用传来的值
如果第二个参数没有值, 则用_来代替

#!/bin/sh
echo para1=$1
echo para2=${2-_}
输入
./test0717.sh a

结果
para1=a
para2=_
输入
./test0717.sh a bbb

结果
para1=a
para2=bbb

20- 数组

定义一个名为IPTS的数组

Array=( 10.0.0.1 10.0.0.2 10.0.0.3)

1)第一个元素

输入
echo ${Array}

显示 第一个元素
10.0.0.1

2)所有元素的列表

输入
echo ${Array[@]}

显示 所有元素的列表
10.0.0.1 10.0.0.2 10.0.0.3

3)元素个数

输入
echo ${#IPTS[@]}

显示 元素个数
3

4)下标值为1的元素

输入
echo ${IPTS[1]}

显示 下标值为1的元素
10.0.0.2

21- 运算符

21.1 expr 用于整数值计算

1,输入
expr 4+2		#(错,要数字与运算符中间要加空格)

显示
4+2
2,输入
expr 4 + 2

显示
6
3, 输入
expr 4 + 9.0 	#(错, 数字必须是整数)

显示
expr: non-integer argument
expr算得的值如何赋给变量

4, 输入
add_value=`expr 4 + 2`
echo "add_value=$add_value"

显示
add_value=6

21.2 let

let "变量名=变量值"

1, 输入
let b=3*4
echo $b

显示
12

值以0开头为八进制
值以0x开头为十六进制

双圆括号是let命令的简化
((a=10))

((a++))

echo $((10+22))

22- 特殊字符之 括号

22.1 圆括号 () 和 (())

()      产生子shell 使用圆括号会产生一个子shell,如(xyz=223)
        数组初始化
(())    做算术运算      (())let 命令的简化  ((a=8+2))

22.2 方括号 [] 和 [[]]

[]      做测试  [ 4 -gt 2 ]
[[]]    测试扩展[[ 4 > 2 ]]     做真正的测试

22.3 尖括号 重定向符号 <>

<>   做输入输出重定向 比较大小

22.4 花括号 {}

{ }     输出范围 ehco {0..9} 输出0-9的数字

let 变量名=变量值

23- expr

expr (evaluate expressions的缩写)。“表达式求值”。
Shell expr是一个功能强大。并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比>较、字符串匹配、字符串提取等。

23.1 用expr计算一个整数运算

expr \( 4 + 2 \) \* 2
12

23.2 用" "(两个反引号) 将计算的结果赋值给新的变量

value1=`expr \( 4 + 2 \) \* 2`
echo $value1

12

23.3 用 $() 将计算的结果赋值给新的变量

value2=$(expr \( 4 + 2 \) \* 2)
echo $value2

12

24- for的使用

for 参数 in 参数列表
do
        操作命令
done
参数列表的产生: 使用 命令 / 文本文件
{0..9}  ---> 产生1-9的列表
/home/*.sh
for filename in ls `/home/*.shsh`
do
        mv $filename $(basename $filename *.shsh).sh            #将后缀为shsh改为sh
done

25- 使用循环处理未知参数

while [ $# -ge 1 ];
do
        echo "total paras=" $#
        if [ $1 == help ] ; then
                echo '$1' =$1
        fi
        shift
done

26- 脚本优先级控制

使用nice renice 调整脚本优先级
避免出现 "不可控的"死循环

27- 一次性计划任务

  设置
        at + 时间 + 命令
  查看
        atq

28- 周期性计划任务

  配置
        crontab -e
  查看
        crontab -l

29- 如果数据不能按照预期时间运行

29.1 延迟计划任务

anacontab

29.2 flock 锁文件

三、文本操作篇

30- find

30.1 find 目录 -name 文件名

find /etc -name passwd 查找 /etc 目录下文件名为passwd的文件
find . -name "*bin"    查找 当前目录下后缀名为 bin的文件名

30.2 find 目录 -regex 文件名

find /etc -regex .*wd     查找 /etc 目录下以wd结尾的文件

在这里插入图片描述

find /etc -regex .etc.*wd 查找 /etc 目录下文件名含 etc且wd结尾的文件

在这里插入图片描述

find /etc -regex .*sec.*wd  查找 /etc 目录下文件名含 sec且wd结尾的文件

在这里插入图片描述

30.3 find 目录 -type x -regex 名字

find 目录 -type d -regex 目录名
find 目录 -type f -regex 文件名

查找当前目录以及所有子目录下文件名含.h的文件
第一种
find ./ -type f -regex .*.h
第二种
find ./ -type f -name "*.h"

查找当前目录以及所有子目录下文件名含.h 且文件内容含有abcd的文件
第一种
find ./ -type f -regex .*.h | xargs grep abcd
第二种
find ./ -type f -name "*.h" | xargs grep abcd

30.4 find 目录 -xtime xxx

find 目录 -atime xxx    atime access 访问时间
find 目录 -ctime xxx    ctime change 改变时间
find 目录 -mtime xxx    mtime modify 修改时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值