极客时间--《LINUX实战100讲》笔记

LINUX的用户及用户组

su 切换用户,如果带-则是完全切换,被把目录进入到用户家目录。

sudo 用自己的用户以其他用户身份执行命令

usermod用于修改用户的属性

usermod -d /home/w1 user3 可以用于用户的家目录

创建用户组

groupadd group1

usermod -g group1 user1 将user1的用户组改为group1

useradd -g group1 user2 新建用户并将它设置为group1

/etc/passwd 用来保存用户信息

/etc/shadow 保存用户密码

/etc/group 保存用户组相关信息 ,用来设置一个用户两个组

系统运行级别

checkconfig list查看各服务在什么init级别下运行

systemd的是在wanted里面的target有

和init级别对应的target,达到init的效

如,runlevel.target。

init各级别与systemd对应关系

在这里插入图片描述

linux后台运行

加&,后台运行

jobs列出后台运行的任务

fg jobid弹出到前台

ctrl+z收回到后台,挂起了。

bg1 重新后台运行

信号

管道和信号是两种进程通信的方式

ctrl+c其实是一种信号

kill -l查看所有信号

screen保持后台运行

screen: 即使网络断开了(关闭终端),也可以继续运行 程序。

screen 进入screen

ctrl + a + d退出screen

screen -ls查看当前screen的列表

screen -r screenid切入到screen

SELINUX

SELINUX防止权限控制不当

原理:给用户 进程 文件打上标签 ,标签一致才能修改文件。

vim /etc/selinux/config编辑是否开启selinux,重启生效。

查看磁盘及分区

如果swap不开启,内存不足会随机杀掉。

fdisk查看磁盘及它的分区

parted -l也可以查看 和上面的差不多

df -h看分区和挂载目录及容量

ls -l /etc/passwd,查看含有空洞文件

du /etc/passwd,查看实际占用的文件

dd创建空洞文件

linux文件的构成

ls -li /etc/passwd

查看passwd文件的i节点编号

i节点上存储了权限,所属组之类的信息,i节点链式挂载了datablock数据块

i节点,文件名记录到父目录的i节点中

ls 查看的数据块的整体大小

du是查看数据块实际使用大小

个体比较小的文件,在linux中也是用4K

这是各类文件服务器出现的原因

  • mv改名会改变i节点吗?

不会,他只会改变目录里i节点的文件名

  • mv移动会改变i节点吗?

离开分区时会,不离开分区不会,离开分区时很长。

  • 正常vim修改文件会改变i节点吗?

会,原理是vim有个swp文件存在,这是vim对文件一致性的考虑,相当于改变了文件。

  • rm是什么原理?

父目录的文件名和文件的i节点断开

  • ln的原理(硬链接)?

让文件名指向i节点,就实现了多个文件名指向同一个i节点。

  • 跨越分区,如何链接?

使用软连接,ln -s afile aafile,两者的i节点就不一样了, 它保存了其代表的文件的
绝对路径,是另外一种文件(链接文件),在硬盘上,有独立的区块,访问时会替换自己的路径。
所以,如果删除掉被链接的文件,再去打开软链接,被链接文件,自然打不开。(和win快捷方式一样),但是硬链接能打开,因为他不是替换。而是有相同的i节点引用。软连接的一切操作都是会替换到被链接的文件,虽然他们的i节点不同,但是修改软连接的权限,也是修改的被链接的文件。

普通权限的补充

普通的权限不满足,要使用facl

getfacl afile

setfacl -m :user1:r afile

给硬盘分区

fdisk查看硬盘

fdisk /dev/sdc 对sdc硬盘设备分区

n 新建分区

p 主分区

设置分区号 1

起始值回车用默认

last扇区:+50G 给分区1分配50G

fdisk -l查看分配的分区

mkfs.ext4 /dev/sdc1对分区做文件系统

mkdir /mnt/sdc1

mount /dev/sdc1/ /mnt/sdc1

大于2T的,用parted命令进行挂载

mount挂载是临时的,需要修改etc/fstab才能永久保存

这个文件

/dev/sdc1 /mnt/sdc1 ext4 defaults 0 0

给swap扩容

swap分区扩容

用分区的方式给swap扩容

mkswap /dev/sdd1

swapon /dev/sdd1

swapoff /dev/sdd1

用文件的方式给swap扩容

dd if=/dev/zero bs=4M count=1024 of=/swapfile

mkswap /swapfile

chmod 600 /swapfile

swapon /swapfile

永久保存需要修改fstab

vim /etc/fstab

/swapfile swap swap defaults 0 0
第一个0代表是否备份 第二个0代表自检

linux组RAID

RAID

多块硬盘组合

RAID 0 把一份数据拆成两份,单盘只存50%

RAID 1 镜像,两个硬盘存的一样

RAID 5 有奇偶校验

RAID 10

要使用RAID卡比较好

逻辑卷

LVM

卷:一个物理设备就是一个卷

物理卷分区扩容需要先拷走文件

逻辑卷: 叠在物理上面,逻辑上的一个设备

查看系统综合状态

系统综合状态

sar -u 1 10

sar -r 1 10

linux查看十六进制文件

hexdump可以看十六进制文件

各种方式执行shell脚本

bash ./filename.sh 子进程

./filename.sh 子进程,用#!后面的东西去解释这个脚本

source ./filename.sh 当前进程

. ./ filename.sh 当前进程

cat命令输入文件

cat > /tmp/a.sh < EOF

echo ‘hello’

EOF

let命令

使用let计算

let a=10+20

shell中最好不要计算

将命令结果给到变量

命令结果赋值给变量,也可以使用``

letc=$(ls -l /etc)

变量中如果有空格

name="xu jz "

查看环境变量

env 查看环境变量

set 查看环境变量及预变量

$号的作用

$$ 进程号

$0 进程名 不同执行方式 结果不一样 bash执行时,是shell文件名称

$? 上一个命令执行结果

$1 $2 ${10}读取位置参数

${2-k} 如果$2没值 那就用 'k’替换

默认环境变量加载

/etc/profile

/etc/profile.d

~/.bash_profile

~/.bashrc

/etc/bashrc

source 可以导入环境变量,如果修改了环境变量文件,则source则可以导入环境变量

原理:根据各种情况进入bash,调用不同的配置文件,则变量开始生效,比较nologin shell 和login shell是加载

不同配置。su - root 获取一个 login shell。

数组

IPTS=(10.0.0.1 10.0.0.2 10.0.0.3)

打印数组 echo ${IPTS[@]}

打印数组数量 echo ${#IPTS[@]}

完全引号和非完全引号

“”不完全引号,会去解析$

''是完全引用

``是命令

算数运算

expr 用于算数运算符 a=expr 4 + 5 记得 要空格

let a=4+5 让变量a为9

(( a=4+5 )) 双括号其实是let的简写, 让变量等于9

只支持整数运算

特殊符号总结

圆括号可以产生子shell (a=123),这个产生了一个子shell

数组pts=(10 23 30)

运算echo $(( 10+20))

( ) 用 于 在 里 面 加 入 一 个 命 令 , c m d 1 = () 用于在里面加入一个命令, cmd1= (),cmd1=(ls),则cmd1是ls的运行结果

echo {0…9} // 打印0 到 9,花括号与数字没有空格

cp /etc/passwd{,.bak} // 利用花括号复制省略

test命令 test 7 -gt 6 ,测试7是否大于6 是的话,是的话返回0,不是的话返回1,返回用$?查看

test等价于[ 7 -gt 6 ]是的话,打印出$?

测试的扩展 [[ 5 > 4 ]] 如果不用此扩展 则 []里面只能用gt这样的命令,[[]]能用数字运算比较

test akc = akc // 等号两侧记得加上空格

[ akc = akc ] // []和test等价,[]与test 只支持 =和 !=,不支持>这样的符号,要这样的逻辑只能用-gt, test 6 -gt 3

(( 5 > 3 && 6 > 5 ))

(( ! 5 > 4 ))

[ -e /tmp/xujz/test.json ] //判断是否存在

[ -d /tmp/xujz/test.json ] //判断是否是普通文件

[ -f /tmp/xujz/test.json ] //判断是否是普通文件

[[]] 里面可以加判断表达式,比如字符串的和数字的

(())里面只能用于数字运算的表达式

if 语句

if [ $UID = 0 ]; 
then    
   echo " i am root";
fi

if pwd;
then 
   echo "run pwd success"
fi


if [ $USER = root ]; then
   echo 'you are root'
elif [ $USER = user1 ]; then
   echo 'you are user1'
else 
   echo 'other user'
fi

case语句


#!/bin/bash

cmd=$1
echo $cmd
case "${cmd}" in
      "START"|"start")
       echo $0 start
      ;;

      "STOP")
       echo $0 stop
      ;;
      *)
       echo "usage: $0 start | stop"
      ;;
esac

shell的循环

  • for循环
for filename in `ls *.mp3`
do 
   mv $filename $(basename $filename .mp3).mp4
done

  • C语言风格的for
for (( i=1; i<=10; i++ ))
do
   echo $i
done
  • while循环
while [ $a -lt 10 ];
 do
 (( a++ ))
 echo $a
done
# 写一个不断循环
while :;
do
  echo "run"
done
  • until循环
// 直到条件为真才结束循环
until [ 5 -lt 4 ];
do
  echo always
done

break和continue

各种$参数的含义

$0 代表脚本的名字

∗ 和 *和 @ 获取所有参数

$# 代表参数个数,shitf是参数左移,即删掉第一个参数

while [ $# -ge 1 ]
do
   echo $1
   shitf
done

shell函数

function cdls() {
  cd /var
  ls
}
# 还可以将function省略掉
cdls() {
  cd /var
  ls
}
# 函数接参数,也是用$接收
cdls() {
  cd /$1
  ls
}
# 使用
cdls /tmp
# 使用local定义变量,防止变量影响到外部变量
checkpid() {
  local i
  for i in $*;do
    [ -d "/proc/$i" ] && return 1
  done
  return 0
}
# 使用source或者. checkpid.sh方式导入函数,不能使用bash checkpid.sh方式导入,否则函数存在子进程中
source checkpid.sh

系统函数库

source /etc/init.d/functions
echo_succes
# pathmunge函数 用于加配置到PATH中
source /etc/profile 

脚本资源控制

nice renice控制脚本优先级
# 查看资源限制
ulimit -a

shell 脚本信号捕获

有些时候,我们希望我们的脚本不被ctrl+c停止,就要捕获这个信号,ctrl+c是信号2,所以我们可以捕获他,9信号是不可捕获的。

# 捕获2信号,即ctrl+c
trap "can't no stop" 2

crontab定时任务

计划任务

at 18:01
echo hello > /tmp/hello.txt
# 配置crontab
crontab -e 
# 查看crontab
crontab -l
# 存储cron任务的目录
cd /var/spool/cron

延时计划任务

# 查看延时计划任务
vim /etc/anacrontab

脚本单例运行

# flock -xn即排他,利用文件锁进行的
flock -xn "/tmp/f.lock" -c "/root/a.sh"

文本查找元字符

# 查找文件里的password
grep password /root/anaconda-ks.cfg
# 匹配换行符以外的任意单个字符,一个.代表一个字符
grep pass.... /root/anaconda-ks.cfg
# $是结尾,查找pass开头,接着四个字符,结尾的
grep pass....$ /root/anaconda-ks.cfg
# *匹配前一个字符的任意个,下面的能匹配 0个s(pas) 一个s(pass) 两个 s(passs)
grep pass* /root/anaconda-ks.cfg 
# *与.搭配使用,可以匹配 passsdfdfe,即匹配pass开头
grep pass.* /root/anaconda-ks.cfg
# []匹配方括号任意字符,匹配Hello或者hello
grep [Hh]ello /root/anconda-ks.cfg
# 以开头 ^# 以#开头
grep ^# /root/anconda-ks.cfg
# 转义,查找带.号,记得带""
grep "\." anaconda-ks.cfg

扩展元字符

# + 匹配一次到多次
# ? 匹配零次或一次
# | 匹配它前面或后面的正则表达式

示例

# 这种只能使用通配符
find /etc/ -name passwd
find /etc/ -name passwd*
# 加上-regex就能使用元字符
find /etc/ -regex .*wd$
# 精确找到/etc/passwd
find /etc/ -regex .etc.*wd$
# 查找8小时内未访问的,ctime是改了i节点
find /etc/ -atime 8

cut命令

# 将每行用空格分开,然后取第一个
grep pass /root/anaconda-ks.cfg | cut -d " " -f 1
# 用空格分开,然后排序,然后统计每个出现次数,然后再排序。uniq只会对相邻的行做统计,所以第一次sort是为了这个
cut -d " " -f 7 /etc/passwd | sort |  uniq -c | sort

Sed命令

sed命令,也是可以使用元字符的

将文件以行为单位读入内存(模式空间)

使用sed的每个脚本对改行进行操作

sed命令使用

// \1即捕获组的第一个,这里就是空格,所以代码的意思
// 将每一行以至少一个空格开头的行在行首加#
sed -i 's/\(^[[:space:]]\)/#\1/g' /tmp/rc.sysinit
sed 's/old/new/' filename
# 多个处理,也可以将-e去掉,然后用分号;隔开, sed 's/old/new/;s/old/new/'
sed -e 's/old/new/' -e 's/old/new/' filename
# 替换完成写到文件里
sed -i 's/old/new' 's/old/new' filename
# 支持扩展表达式,即支持+ ? |
sed -r 's/扩展正则表达式/new' filename
# sed的分组功能,用括号括起来,然后\1取得分组
sed -r 's/(a.*b)/\1:\1/'
# 全局替换/g ,第二个匹配则使用 /2
head -5 /etc/passwd | sed 's/root/!!!!/g'

sed命令加强版

# p打印模式空间,在行末打印模式空间 
head -5 /etc/passwd | sed 's/root/!!!!/p'
# 只输出替换成功的行 -n,
head -5 /etc/passwd | sed -n 's/root/!!!!/p'
# 将替换成功的输出到文件中
head -5 /etc/passwd | sed -n 's/root/!!!!/w' /tmp/a.txt

sed寻址

# 使用正则表达式寻址
head -t /etc/passwd | sed '/^bin/s/adm/!/'
# 使用行号限制 n,ms,第n到m行,ns即第n行
head -t /etc/passwd | sed '1,3s/adm/!/'
# 混合使用,正则表达式混合行号 以bin开头直到结尾
head -t /etc/passwd | sed '/^bin/,$s/adm/!/'
# 寻址匹配多条命令
head -t /etc/passwd | sed '/^bin/{s/adm/!/;s/rdm/!/}'

其他sed指令

# d,删除匹配的模式空间,因为删除了,所以此模式空间的相关命令不会再执行
sed 'ab/d' bfile
# i,追加命令,在匹配ab的上一行插入Hello
sed 'ab/i Hello'
# a,追加命令,在匹配ab的下一行插入Hello
# c,将匹配的模式空间替换
sed 'ab/c Hello' 
# 输出匹配book的行
sed -n '/book/p'

AWK的使用

sed将不规范的文本格式化为规范的文本,awk再将规范文本输出

// 读取以menu开头的行,以单引号分隔
awk -F "'" '/^menu/{print $2}' /boot/grubs/grub.cfg
// x++用于,可以用于显示得到的行号
awk -F "'" '/^menu/{print x++,$2}' /boot/grubs/grub.cfg
使用FS,及OF控制切割符及结果分割符

在这里插入图片描述

使用RS作为行分割符号, 默认是\n。

在这里插入图片描述

使用 NR和FNR显示行号
# 显示行号及该行内容
head -5 /etc/passwd | awk '{print NR, $0}'
# FNR会将文件各自的行号列出来,而FNR会将文件的行号递增
awk '{print FNR,$0}' /etc/hosts /etc/hosts
使用NF看字段数量
# 以:为分隔符,查看每行的字段数量
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}'
# 以:为分隔符,查看每行的最后一个字段内容
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $NF}'
awk还能支持关系操作符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L8fUFQ5W-1611407403969)(C:\Users\Jazon\Desktop\linux\kpi.png)]

# 第二个字段大于等于80,打印第一个字段
awk '{if($2>=80) print $1}' /etc/kpi.txt
# 使用循环遍历每一个值
awk '{sum=0;for(c=2;c<=NF;c++) sum+=$c;print sum/(NF-1)}' kpi.txt 
# END代表整个文件读取完成之后才会去做的操作 
awk '{sum=0;for(column=2;column<=NF;column++) sum+=$column;average[$1]=sum/(NF-1)}END{for(user in average) sum2+=average[user];print sum2/NR}' kpi.txt
# 将awk(上面单引号那段)保存成文本文件avg.awk,后续直接用文本文件可以使用awk
awk -f avg.awk kpi.txt
# 命令行参数数组ARGC及ARGV
BEGIN{
      for(x=0;x<ARGC;x++)
        print ARGV[X]
      PRINT ARGC
}
# awk还能自定义函数,下面的语句定义了一个函数double,结果将打印hello awkhello awk
awk 'function double(str) {return str str} BEGIN {print double("hello awk")}'

vim

shift+i ,光标停留行首

小写的a,光标进入之前光标的下一位

大写的a,光标进入到之前光标的行尾

小写的o进入当前的行的下一行,并且将下一行往下移,得到一个空行。

大写的o进入当前的上一行,并且把上面的内容都网上移一行

HJKL,左下上右

yy复制整行,3yy复制当前包含当前行的三行,y$复制当前光标到行尾

p进行黏贴

dd 剪切当行,d$当前光标到行尾剪切

ctrl+r将撤销的重做

x将单个字符的删除

r将当前字符进行替换

数字 加 shift+G移动到数字行

shift+G到最后一行

g到第一行

^字符到行首

$到行尾

:!可以用于执行其他linux 例如:!ifconfig

查找之后按n可以查看下一个,大写N(shift+n)查看上一个

:s/old/new 替换,将old替换为new默认支队光标所在行,:%s/x/X,将找到的x替换为X,两条

都是只替换一处,:%s/old/new/g可以替换整篇文档。:3,5s/x/X/g将3到5行的小写x替换为X

:set nu 设置行号 :set nonu取消行号

vim /etc/vimrc 这是vim的配置文件,可以配置为自动显示行号

可视模式:

小写v进入字符可视模式

shifit+v进入行可视模式

ctrl+v进入块可视模式

进入到可视模式,可以进行多行一起处理。shift+i,编辑第一行的,然后按两下ESC,即可全部行生效。按一下d,则全部选中的会被删除。

RPM的格式

RPM:

在这里插入图片描述

获得rpm的方法:

1.网上下载

2.系统光盘

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值