Jimmy小站

小明也有大梦想 — 蒋明/铭
当前位置:网站首页 / 开发环境配置 / 正文

Linux学习笔记

2020-03-23 / 开发环境配置 / 2543 次围观 / 0 次吐槽

Linux学习笔记

linux100讲学习笔记,课程零碎的记录

vim 四种模式

正常模式:

​ 复制

​ yy复制整行

​ 数字yy (如 5yy) 复制从当前行到往下数5行

​ y$从当前复制到末尾

​ 剪切

​ dd 同yy

​ d$

​ 粘贴 p

​ 重做 (ctrl+ r)

​ 撤销 u

​ 进入插入模式:

​ i 直接进入,并且插入位置在光标位置

​ I 光标所在行的行首

​ a 光标位置后一位

​ A当前行最后

​ o当前所在行的下一行(产生新一行)

​ O当前行上一行插入新行

​ 单个字符删除 x

​ 单个字符替换 光标移动到指定字符 按r 接着输入新的字符

​ 光标移动到指定行 数字+ G (shift +g)

​ 首 g 行尾 G

​ 正常模式下光标到行首^ 行尾 $

插入模式:

命令模式:

​ :set nu 文本显示行号

​ :q q! wq

​ 查找 /需要查找的字符 查找到之后 按u查找下一个 U上一个

​ 替换

​ :s /将被替换的字符/替换字符 (光标所在行)

​ :%s 整个文本查找

​ :3,5s 从3~5行查找替换

​ :s /将被替换的字符/替换字符/g 对找到的所有匹配项全部替换

视图模式:

​ v V ctrl+v

用户与用户组管理

id 用户名 查看用户的用户组信息

useradd 用户名 添加用户 (root 用户才有权限) 可知直接新建时指定组 useradd -g 组名 用户名

/etc/passwd 和 /etc/shadow 中会记录系统中的用户 /etc/group

passed 用户名 给指定用户设置其他人的密码,不加用户名 则设置自身密码

userdel 删除用户 userdel -r 同时删除用户的家目录

usermod 修改用户属性 usermod -g 修改后的组 用户名

chage 限制用户在什么情况下可以登录

groupadd groupdel

visudo 授权普通用户执行指定的高权限用户(不需要密码)

​ 进入编辑界面 授予的用户 ALL(host) 命令路径 参数

文件与目录

文件与目录权限drwxrwxrwx

网络

网络管理

​ /vim /etc/default/grub 在GRUB_CMDLINE_LINUX=””中添加

​ 再执行:grub2-mkconfig -o /boot/grub2/grub.cfg 修改成eth0格式的网卡命名方式

​ 查看网卡物理连接情况 mii-tool eth0

net-tools

​ ifconfig

​ route

​ netstat

​ iproute

​ ip

​ ss

网络配置

​ 查看网络配置

​ 修改网络配置

网络故障排除命令

tranceroute 查看每一跳 tranceroute -w (wait) 1 (时间 单位s)

mtr 检查中间是否又数据包丢失

nslookup 域名对应的IP是否解析正确

telnet 检查端口是否正确

tcpdump

tcpdump -i any -n host XXX and port XXX -w /tmp/dumpfile

netstat -n(显示IP不是域名) -t(tcp方式截取) -p(进程) -l(listening状态的服务)

ss

网卡配置文件地址:/etc/sysconfig/network-scripts/ifcfg-eth0

强制修改Root密码

启动选项界面,按e进入编辑模式,找到Linux16开头的行,在最后加入 rd.break (cetos7)

这时候是Root用户,但是是一个临时系统。真正的体统根目录在 /sysroot

重新挂载sysroot为可读写模式 mount -o remount ,rw /sysroot

修改临时系统的根目录为真实体统的根目录 chroot /sysroot 这样对临时root用户做的操作,就会实际修改真实的操作系统中的信息

echo 123456 | passwd –stdin root

SELinux会检测修改密码的操作不是标准修改,导致无法进入系统,这里需要关闭它

关闭SELinux vim /etc/selinux/config 把 SELINUX=enforcing改为disabled

最后重启

进程管理

运行./a.sh 后台运行 ./a..sh &

如果是在后台运行,通过jobs命令查看有几个后台程序(会带有编号),然后使用 fg 编号 调到前台运行。

如果是在前台运行,可以使用Ctrl+Z暂停,再 jobs 再 bg 编号 (后台运行) fg 编号 (继续前台运行)

kill -9 pid 强制关闭某个进程

systemctl

​ /lib/systemd/system中

内存与磁盘管理

使用率查看

内存使用率 free top

​ free -m 按兆现实 top实时更新

磁盘使用率 fdisk df du

du与ls区别 du 查到的是实际占用的空间。ls查到的是文件从头到尾的计算值

dd if=afile of=bfile bs(块大小)=512 count=1(一块)

df -h

EXT4文件系统

超级块 记录整个文件系统/分区中包含多少文件 df查看的就是这里

超级块副本

i节点 记录每一个文件 名称 大小 编号 权限 注意:文件名记录在父母离的i节点

数据块 如果i节点(一个数据块)存不下,会在i节点挂在更多数据块。因此根据实际使用的数据块的多少就能统计数据块的大小(du 命令),而ls统计的是i节点当中记录的文件大小信息(i节点有可能挂载空的block)

文件操作

touch cp mv 而vim(会修改i节点,实际修改的是一个临时文件,保存是替换)

创建链接 (类似于windows的快捷方式)实际通过i节点连接 命令为ln (跨分区或文件系统无效,可以通过软链接实现,ln -s)

chmod chown 修改链接文件的权限 无效,实际还是以被链接的文件实际权限为准

facl文件权限高级操作

getfacl 文件名 获取用户的属主、属组 及对应角色的权限

setfacl -m(赋予) -x(回收) u:用户名(或者g:组名):rwx 文件名

分区和挂载

常用命令

fdisk 创建分区 如fdisk 、/dev/sdb

mkfs 格式化分区 mkfs.ext4(这里有好几个选项。不同的格式) /dev/sdb1

parted 大于2T的磁盘需要这个分区

mount 分区是无法被读取的,需要挂载到指定的目录上,对该目录读写,就会落入磁盘对应的分区上

先mkdir /mnt/sdb1 再 mount /dev/sdb1 /mnt/sdb1

mount 不带参数就是查挂载的情况

常见配置文件/etc/fatab 将常用命令指令固化(常用命令关机失效,上面的挂载关机后就没了)

Shell篇

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

Linux 启动过程 BIOS-MBR-Bootloader(grub)-kernel-systemd-系统初始化-shell

看MBR

dd if=/dev/sda of mbr.bin bs(块大小)=512 count=1(一块) 导出整个sda中的启动引导文件(固定512字节)

chmod u+rx filename 给文件赋予可执行的权限(可读可执行)

命令的执行

  • bash ./filename.sh 在终端产生子进程执行,无需赋予执行权限
  • ./filename.sh 同上,需要在命令文件首行指定解释器,需要赋予执行权限
  • source ./filename.sh 在当前进程运行,命令执行会影响当前运行环境
  • . filename.sh 同上

内建命令和外部命令:

  • 内建命令不需要创建子进程,而外部命令需要
  • 内建命令对当前shell生效

管道与重定向

管道
管道与管道符:管道符 | 将一个命令的执行结果传递给后面的命令。如
ps | cat
echo 123 | ps
管道符将后面的命令创建子进程,将左边进程的标准输出与右边进程的标准输入建立管道通信
管道符是通过创建子进程的方式连接两个命令,因此在管道符右边的命令使用了cd/pwd等内建命令不会影响当前环境

子进程与子shell

重定向符号
输入重定向 <
输出重定向 > 覆盖 >> 追加 2> 文件描述符2重定向(错误信息重定向) &> 正确错误全部输出到指定文件

输入与输出重定向组合:一般用于生成配置文件

#! /bin/bash
# 将生成一个新a.sh文件,内容为"generate new sh"
cat > /root/a.sh <<EOF
echo "generate new sh"
EOF

变量

变量赋值
变量名=变量值 不能有空格
l=ls 将命令赋给一个变量 相当于给命令其别名
let c=$(ls -l /etc) 将命令执行结果赋值给变量
变量作用范围
定义的变量在子进程 父进程 子Shell(bash命令)平行shell 都无效,旨在自身进程有效
如 bash ./filename.sh 脚本中定义了变量,是不会传递到当前环境的。如果需要传到当前环境,需要使用source ./filename.sh
在父进程执行 export var1 则在子进程就能获取到var1这个变量
unset 变量名 删除赋值
环境变量
$PATH
PATH=$PATH:/root 在环境变量后面追加一个路径,这个方法对自身和子Shell生效,新开启的Shell无效。如果需要全局生效,可以在bashrc配置文件中配置。
预定义变量
$? 确认上一条命令是否正确执行,正确0 不正确1
$$ 显示当前进程的PID (脚本监测 脚本运行状态时使用)
$0 当前进程的名称
位置变量
$1 $2 $3 $…${10}…
$0 表示脚本名称
$* 表示所有传入参数的数组
$# 参数的数量
执行脚本时传入的参数
避免读入空值,如果参数没有指定,指定默认值”_“ :${2}_
如果对位置变量进行赋值,这样的操作会在传入值后面多出一个下划线,解决方案:替换语法:pos1=${2-_} 如果是空才用下划线赋值。
环境变量配置文件

  • /etc/profile
  • /etc/profile.d
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc
    按以上顺序加载。如果有重复,则后面会替换前面的

bashrc profile的区别 用户登录时加“-”号 所有配置都生效,如果切换用户时不加 “-”号,则只有bashrc中的配置生效。
数组
定义 var1=(aaa bbb ccc)
echo ${var1[@]} 取全部数据
echo ${#var1[@]} 统计数组个数
判断
test判断程序中的细节问题
test -f filename 检测是否存在并且是一个常规文件
也可以简化成 [-t filename]
echo $? 为0表示test正常退出,1表示异常,即文件不存在或者不是标准文件类型
结合if和test

# 如果是Root用户,就显示条件体中的内容
if [$UID = 0]
then
    echo "root user"
fi

实际上if也可以判断一个命令执行是否成功

# 如果是Root用户,就显示条件体中的内容
if [pwd = "sss"]
then
    echo "sss working directory"
fi

if else

#! /bin/bash
# if else demo
if [$USER = root]; then
    echo "root user"
else
    echo "other user"
fi

case

#!/bin/bash
# 
case "$1" in
    "start"|"START")
        echo $0 "starting"
        ;;
    "stop"|"STOP")
        echo $0 "stop"
        ;;
    "restart"|"reload")
        echo $0 "restarting"
        ;;
    *)
        echo "usage hint"
        ;;
esac

for
while until
break continue
使用循环处理位置参数

#!/bin/bash
for parm in $*; do
    if[ "$param" = "help" ]
        echo "include help parameter"
    fi
done

自定义函数

function cdls() {
    cd /$1
    ls
    # 函数内的变量
    local local_var
    #$1 $2 ... 传参
}

#使用,/tmp是传入的一号参数
cdls /tmp
========================================

#!/bin/bash
# function可以省略
checkpid() {
    local i
    for i in $*; do
    # if test 的简单写法
        [ -d /proc/$i ] && return 0
    done
    return 1
}

信号

trap命令能够捕获传给进程的信号,-9是不能捕获的,kill -9 pid 会强制关闭进程

#!/bin/bash
# signal demo
# 捕获15号信号,如果收到就输出相应提示
trap "echo sig 15" 15
# 2号信号表示 Ctrl+C
trap "echo sig 2" 2
# 输出当前进程号
echo $$
#保持进程不结束
while :
do
    :
done

vim sed awk

  • vim是交互式的。有正常模式、输入模式、视图模式等等,实时与用户进行交互的编辑器。sed awk 是非交互的,在执行之前就要指定好逻辑
  • sed awk 是 行编辑器
    sed末世空间
    将文件以行为单位读取到内存
    使用sed的每个脚本对该行进行操作
    处理完后输出该行
    sed ‘s/被替换内容/替换内容’ 只替换匹配的第一个

推荐您阅读更多有关于“Linuxshell,”的文章

[一个Java程序猿的转型之路,读研深造,专注机器学习推荐算法]
本站所有文章如无特别注明均为原创。作者:吉米酱 ,复制或转载请以超链接形式注明转自 Jimmy小站
原文地址《Linux学习笔记
额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © Jimmy小站 Allrights Reserved.备案号:桂ICP备 15005996