Linux随笔记录

linux随笔

1.系统信息

  • 查看linux内核信息

    uname -a
    cat /proc/version
    
  • 查看cpu信息

    cat /proc/cpuinfo
    
  • 查看内存信息

    cat /proc/meminfo
    
  • 查看模块信息

    cat /proc/moduels
    
  • 查看支持的文件类型

    cat /proc/filesystems
    
  • 查看内核参数

    sysctl -a
    

2.网络

  • 存放端口的文件

    cat /etc/services
    
  • 显示所有网络接口的详细信息

    ip addr show
    
  • 显示指定网络接口的详细信息

    ip addr show eth0
    
  • 启用或禁用指定的网络接口

    ifup eth0
    ifdown eth0
    
  • 为指定的网络接口添加 IP 地址

    ip address add 192.168.2.3/24 dev eth0
    
  • 从指定的网络接口删除 IP 地址

    ip address del 192.168.2.3/24 dev eth0
    
  • 显示路由信息

    ip route show
    
  • 添加路由

    ip route add 192.168.2.0/24 via 10.0.0.1 dev eth0
    
  • 删除路由

    ip route del 192.168.2.0/24
    
  • 添加DNS

    echo "nameserver 114.114.114.114" >/etc/resolv.conf
    
  • 修改网卡名

    1. vim编辑/etc/sysconfig/network-scripts/ifcfg-<old_name>

      DEVICE=new_name
      
    2. 重命名网卡文件

    mv /etc/sysconfig/network-scripts/ifcfg-<old_name> /etc/sysconfig/network-scripts/ifcfg-<new_name>
    
    1. vim编辑/etc/default/grub

      GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
      
    2. 更新grub配置

      grub2-mkconfig -o /boot/grub2/grub.cfg
      
    3. 重启网卡

      systemctl restart network
      

3.TCP/UDP

  • 显示连接,端口信息

    netstat -ntlup
    
    ss -ntlp
    
  • 查看端口占用

    netstat -tuln
    
    ss -tuln
    
    lsof -i :[port]
    
  • 参数说明

    `-t 显示tcp连接`
    
    `-u 显示udp连接`
    
    `-l 仅显示监听端口`
    
    `-n 一数字形式显示端口`
    
  • 查看网络流量

    netstat -i || iftop -i eth0 || nload -m || tcpdump -i <interface> -n || iftop -i <interface>
    
  • tcpdump使用

     tcpdump [参数] [网卡]
    
  • 指定要监听的网络接口

     tcpdump -i eth0
    
  • 指定捕获的数据包数量

     tcpdump -i eth0 -c 10
    
  • 将捕获的数据包写入文件中。

tcpdump -i eth0 -c 20 -w file.pcap
  • 从文件中读取数据包进行分析

    tcpdump -r file.pcap
    
  • 其他参数说明

     `-n:禁用地址解析。`
     
     `-nn:禁用地址和端口的解析。`
     
     `-e:显示以太网头部信息。
     
     `-v:显示详细的输出信息。
     
     `-X:以十六进制和ASCII码显示数据包内容。`
     
     `-q:以更简洁的方式显示输出。`
     
     `port <port>:捕获指定端口的数据包。`
     
     `host <host>:捕获指定主机的数据包。`
     
     `src <ip>:捕获指定源IP地址的数据包。`
     
     `dst <ip>:捕获指定目标IP地址的数据包。`
     
     `tcp:只捕获TCP协议的数据包。`
     
     `udp:只捕获UDP协议的数据包。`
    

4.备份,计划任务

  • 计划任务

    *      *      *     *     *        command
    
  • 参数说明

    `第一个星号表示分钟,范围是0-59,*表示每分钟。`
    
    `第二个星号表示小时,范围是0-23,*表示每小时。`
    
    `第三个星号表示天,范围是1-31,*表示每天。`
    
    `第四个星号表示月,范围是1-12,*表示每月。`
    
    `第五个星号表示星期,范围0-6,其中0表示星期日,*表示一周中每一天`
    
  • 在每个星期天的2:30 执行任务

    30 2 * * 0   command
    
  • mysqldump备份

    mysqldump -u <用户名> -p<密码> <数据库名称> > /path/to/backup.sql
    
  • 不暴露密码形式备份

    1. 编辑my.cnf文件

      [mysqldump]
      user=<用户名>
      password=<密码>
      
    2. 备份

      mysqldump --defaults-extra-file=/path/to/mysql.cnf <数据库名称> >/path/to/backup.sql
      
  • xtrabackup 备份

  • 参数说明

    `--backup:执行备份操作。`
    
    `--prepare:执行备份文件的准备操作,将备份文件准备为可用于恢复的状态。`
    
    `--restore:执行恢复操作,用于将备份文件还原到数据库。`
    
    `--target-dir=<路径>:指定存储备份文件的目录路径。`
    
    `--user=<用户名>:指定连接数据库时使用的用户名。`
    
    `--password=<密码>:指定连接数据库时使用的密码。`
    
    `--datadir=<路径>:指定数据库的数据目录路径。`
    
    `--compress:启用备份数据的压缩。`
    
    `--compress-threads=<线程数>:指定用于压缩的线程数。`
    
    `--compress-chunk-size=<大小>:指定压缩块的大小。`
    
    `--parallel=<线程数>:指定备份和恢复操作并行执行的线程数。`
    
    `--incremental:执行增量备份。`
    
    `--incremental-basedir=<路径>:指定增量备份基于的全备份路径。`
    
    `--incremental-dir=<路径>:指定增量备份的存储目录路径。`
    
    `--no-lock:在备份和恢复操作时不使用锁定表的方式。`
    
    `--tables=<表名>:备份指定的表。`
    
    `--databases=<数据库名>:备份指定的数据库。`
    
    `--exclude=<表名或数据库名>:在备份过程中排除指定的表或数据库`
    
  • mysql全量备份

    xtrabackup --backup --user=<用户名> --password=<密码> \
    --target-dir=/path/to/backup
    
  • mysql增量备份(确保已经进行了全量备份)

    xtrabackup --backup --user=<用户名> --password=<密码> \
    --target-dir=/path/to/incremental_backup --incremental-basedir=/path/to/full_backup
    
  • mysql压缩备份

    xtrabackup --backup --user=<用户名> --password=<密码> \
    --target-dir=/path/to/backup --compress
    
  • mysql指定库备份

    xtrabackup --backup --user=<用户名> --password=<密码> \
    --databases=<数据库名> --target-dir=/path/to/backup 
    
  • mysql 指定主机,数据目录备份

    xtrabackup --host 192.168.12.12 --port 3306 \
    --backup --user=root --password='123456' \
    --target-dir=/tmp/backup --datadir=/root/mysql/data
    
  • 隐藏密码形式备份

    1. 准备 backup.cnf文件

      [xtrabackup]
      backup
      user=root
      password=password
      
    2. 执行命令

    xtrabackup --defaults-file=backup.cnf \
    --databases "database_name1,database_name2" --backup-dir=/path/to/backup
    
  • mysql备份恢复(xtrabackup)

    1. 准备恢复配置文件

      xtrabackup --prepare --target-dir=/path/to/backup
      
    2. 关闭mysql服务

      docker stop mysql
      
    3. 恢复

      xtrabackup --copy-back --target-dir=/path/to/backup --datadir=<指定恢复数据目录>
      
    4. 设置文件权限(非docker安装)

      # 根据您的MySQL数据目录路径进行调整
      chown -R mysql:mysql /var/lib/mysql 
      
    5. 启动mysql服务

      docker restart mysql
      
  • vmwre(ubuntu)和主机互动

    sudo apt-get autoremove open-vm-tools    //卸载已有的工具
    sudo apt-get install open-vm-tools        //安装工具open-vm-tools
    sudo apt-get install open-vm-tools-desktop  //安装open-vm-tools-desktop
    

5.shell

  • sed使用

  • 参数说明

    `-n:取消默认输出,只打印被修改过的文本。不显示输入行。`
    
    `-e:后跟要执行的命令,并允许同时指定多个命令。`
    
    `-f:指定要从文件中读取的命令。可以在文件中包含一个或多个命令。`
    
    `-i:直接在原始文件中进行编辑,而不是将结果输出到标准输出。`
    
    `-r:启用扩展正则表达式。`
    
    `-s:安静模式,处理多个文件时遇到错误时不显示错误信息。`
    
    `1,3d:删除指定行范围内的行。`
    
    `/pattern/:使用模式匹配来选择行。`
    
    `s/pattern/replacement/:将匹配到的模式替换为指定的字符串。`
    
    `p:打印当前处理的行。`
    
    `a\text:在当前行后追加指定的文本。`
    
    `i\text:在当前行前插入指定的文本。`
    
    `c\text:用指定的文本替换当前行。`
    
    `& 已匹配字符串标记。`
    
  • 在包含特定内容所在行的后面添加一行

    sed '/pattern/ a\   <str>' file.txt -i
    
  • 在包含特定内容所在行的前面添加一行

    sed '/pattern/ i\    <str>'  file.txt -i
    
  • 将包含特定内容所在行替换

    sed '/pattern/ c\    <str>'  file.txt -i
    
  • 将hello替换为HELLO

    sed 's/hello/HELLO/' file.txt
    
  • 打印特定行

    sed 'np' file.txt
    
  • 打印包含hello的行

    sed -n '/hello/p' file.txt
    
  • 删除包含hello的行

    sed  '/hello/d' file.txt
    
  • 删除1-3行

    sed '1,3d' file.txt
    
  • 匹配至少出现2次d的行并删除

    sed -r '/d{2,}/d' file.txt
    
  • 匹配str于str之间的行

    # file.txt
    [redis]
    192.168.2.3
    192.168.2.4
    192.168.2.5
    [docker]
    192.168.2.6
    192.168.2.7
    192.168.2.8
    [mysql]
    192.168.2.9
    192.168.2.10
    192.168.2.11
    [nginx]
    192.168.2.12
    192.168.2.13
    192.168.2.14
    [all:vars]
    ansible_user=root
    ansible_ssh_password=123456
    # 匹配[redis]于[docker]之间的内容
    sed -n '/^\[redis\]/,/^\[docker\]/p' file.txt | egrep -v "^\[.*\]$"
    # 输出
    192.168.2.3
    192.168.2.4
    192.168.2.5
    
  • 将匹配的内容用双引号包裹

    sed 's/.*/"&"/' file.txt
    
  • 获取脚本自身的PID

    #!/bin/bash
    pid=$$
    echo "脚本的进程ID是: $pid"
    
  • sed高级

  • 参数说明

    `w: 表示把行写入一个文件。`
    
    `x: 表示互换模板块中的文本和缓冲区中的文本。`
    
    `y: 表示把一个字符翻译为另外的字符(但是不用于正则表达式)。`
    
    `\1: 子串匹配标记。`
    
    `D 删除模板块的开端至\n即第一行。`
    
    `h 拷贝模板块的内容到内存中的缓冲区。`
    
    `H 追加模板块的内容到内存中的缓冲区。`
    
    `g 获得内存缓冲区的内容,并替代当前模板块中的文本。`
    
    `G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。`
    
    `n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。`
    
    `N 追加下一个输入行到模板块后面即"1\n2"形式。`
    
    `p 打印模板块的行。`
    
    `P(大写)打印模板块的开端至\n即第一行。`
    
    `b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。`
    
    `r file 从file中读行。`
    
  • 打印奇数行

    # 先执行命令p打印第1行,接着执行n跳过第2行,接着打印第3行,执行到行尾
    sed '{p;n}' file.txt
    
  • 打印偶数行

    # 先执行命令n跳过第1行,接着执行n打印第2行,接着跳过第3行,执行到行尾
    sed '{n;p}' file.txt
    
  • 删除奇数行

    # 先删除第1行,执行n跳到删除后的第2行,即源文本的第3行,执行到结尾
    sed '{1d; n; d}' file.txt
    
  • 删除偶数行

    sed '{n; d}' file.txt
    
  • 为每一行后面添加空行

    sed '{G}' file.txt
    
  • 为每一行后面添加空行并删除最后一行空行

    sed '{G}' file1.txt | sed '$d'
    
  • 交换行内容

    # 所有行都进行交换
    sed  'N;s/\(.*\)\n\(.*\)/\2\n\1/' file.txt
     
    # 交换匹配行(要加.*)
    sed   'N;s/\(test.*\)\n\(check.*\)/\2\n\1/' file3.txt
    
  • 将匹配到的内容添加到行尾

    sed -e '/test/h' -e '$G' file 
    
  • sed流程控制

    # 跳过包含Line 3所在行并将其他行Line替换成Word
    sed '/Line 3/ b; s/Line/Word/' file4.txt
    
  • awk高级

  • 文本

    cp /etc/passwd ./passwd.txt
    # cat passwd.txt
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    games:x:5:60:games:/usr/games:/usr/sbin/nologin
    man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
    lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
    mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
    proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
    www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
    list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
    irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
    gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
    nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
    _apt:x:100:65534::/nonexistent:/usr/sbin/nologin
    systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
    systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
    messagebus:x:103:104::/nonexistent:/usr/sbin/nologin
    systemd-timesync:x:104:105:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
    pollinate:x:105:1::/var/cache/pollinate:/bin/false
    sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
    syslog:x:107:113::/home/syslog:/usr/sbin/nologin
    uuidd:x:108:114::/run/uuidd:/usr/sbin/nologin
    tcpdump:x:109:115::/nonexistent:/usr/sbin/nologin
    tss:x:110:116:TPM software stack,,,:/var/lib/tpm:/bin/false
    landscape:x:111:117::/var/lib/landscape:/usr/sbin/nologin
    fwupd-refresh:x:112:118:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
    usbmux:x:113:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
    user:x:1000:1000:root:/home/user:/bin/bash
    lxd:x:999:100::/var/snap/lxd/common/lxd:/bin/false
    bind:x:114:119::/var/cache/bind:/usr/sbin/nologin
    
  • Awk基本语法结构

    awk 'BEGIN { initialization } pattern { action } END { finalization }' file.txt
    
  • BEGIN 块(可选):在处理输入之前执行一次的初始化操作,例如设置变量的初始值。

  • pattern:模式,用于匹配输入中的特定行。

  • action:动作,在匹配的行上执行的操作。

  • END块(可选):在处理输入完毕后执行一次的收尾操作,例如输出最终结果。

  • 模式和动作的使用

  • 模式:用于匹配特定的行或条件,可以使用正则表达式、关系表达式等。

  • 动作:在匹配行上执行的操作,可以是打印、赋值、计算等。

    # 示例:打印包含"pattern"的行
    awk '/pattern/ { print }' passwd.txt
    
  • 打印行号及行内容

    awk  '{print NR,$0}' passwd.txt	
    
  • 打印以root开头的行

    awk -F: '/^root/{print}' passwd.txt
    
  • 打印以bash结尾的行

    awk -F: '/bash$/{print}' passwd.txt
    
  • 打印第3列值<500的行

    awk -F: '$3<500{print}' passwd.txt
    
  • 打印第3列值>500&&<1000的行

    awk -F: '$3>500&&$3<1000{print}' passwd.txt
    
  • 打印偶数行并显示行数

    awk 'NR%2==0{print NR,$0}' passwd.txt
    
  • 打印奇数行并显示行数

    awk 'NR%2!=0{print NR,$0}' passwd.txt
    
  • 统计行数

     awk 'BEGIN{x=0} {x++} END {print x}' passwd.txt
    
  • 内置变量
  • NR:当前行的行号。
  • NF:当前行的字段数。
  • $0:当前行的内容。
  • $1$2$3 等:当前行的第一个、第二个、第三个字段等。
  • 内置函数
  • length(str):返回字符串的长度。

    awk 'BEGIN { str = "Hello, World!"; len = length(str); print len }'
    # 输出: 13
    
  • substr(str, start, length):返回字符串的子串。

    awk 'BEGIN { str = "Hello, World!"; sub = substr(str, 1, 5); print sub }'
    # 输出: Hello
    
  • index(str, substr):返回子串在字符串中的位置。

    awk 'BEGIN { str = "Hello, World!"; pos = index(str, "World"); print pos }'
    # 输出: 8
    
  • split(str, array, sep):将字符串拆分为数组元素。

    awk 'BEGIN { str = "apple,banana,orange"; split(str, fruits, ","); print fruits[2] }'
    # 输出: banana
    
  • toupper(str):将字符串转换为大写。

    awk 'BEGIN { str = "Hello, World!"; upper = toupper(str); print upper }'
    # 输出: HELLO, WORLD!
    
  • tolower(str):将字符串转换为小写。

    awk 'BEGIN { str = "Hello, World!"; lower = tolower(str); print lower }'
    # 输出: hello, world!
    
  • int(x):返回不大于x的最大整数。

    awk 'BEGIN { x = 4.7; result = int(x); print result }'
    # 输出: 4
    
  • 说明

    !a[$0]++ 的含义是:
    判断行的值是否已经存在于数组a中,如果不存在,则将该字段添加到数组中,并将其值加1
    
    a[$0]++的含义是:
    将第行的值作为数组a的键,然后将该键对应的值加1
    
  • 去除重复行

    # 以第7列为基准去除重复行
    awk -F: '!a[$7]++{print $7}'  passwd.txt
    
    # 输出
    /bin/bash
    /usr/sbin/nologin
    /bin/sync
    /bin/false
    
  • 统计重复行次数

    # 统计文件中不同单词的出现次数
    awk -F: '{!count[$7]++} END {for(i in count) print i, count[i]}' passwd.txt
    或者
    awk -F: '{ count[$7]++ } END { for (i in count) print i, count[i] }' passwd.txt
    # 输出
    /bin/sync 1
    /bin/bash 2
    /bin/false 3
    /usr/sbin/nologin 29
    
  • 条件语句和循环结构:Awk支持if-else语句和for循环,可实现更复杂的逻辑操作。

    # 计算文件中大于平均值的数的个数
    awk '{ sum += $1;v[$1]++} END { avg = sum / NR; for(i in v) if(i>avg) count++; print count,sum,avg }' numbers.txt
    
  • 使用函数:除了内置函数,Awk还可以定义自定义函数,以便重复使用特定的操作。

  • 将字符串反转并返回

    function reverse_str(str) {
       result = ""
       for (i = length(str); i > 0; i--)
          result = result substr(str, i, 1)
       return result
    }
    # 逐行处理
    {
    	reversed = reverse_str($0)
    	print reversed
    }
    
    
    # 执行
    awk -f reverse_str.awk passwd.txt
    
  • 字符串拆分为数组元素

    function split_str(str,array,sep) {
         return split(str,array,sep)
    }
    # 逐行处理
    {
        split_str($0,array,":")
        print array[2]
    }
    
    # 执行
    awk -f split_str.awk passwd.txt
    
  • awk格式化输出printf

    %s:     字符占位符
    %d:     数字占位符
    %.2f:  小数占位符
    %-s :   左对齐
    %+s :   右对齐
    
  • 案例

    awk 'BEGIN{FS=":"}{printf "%s\n",$1}' passwd
    
    awk 'BEGIN{FS=":"}{printf "%20s" "%20s\n",$1,$7}' passwd
    
    awk 'BEGIN{FS=":"}{printf "%-20s" "%-20s\n",$1,$7}' passwd
    
    awk 'BEGIN{FS=":"}{printf "%d\n",$3}' passwd
    
  • 求平均数案例

    ##文本
    cat student.txt
    Allen  90 80 77 85
    Joe    88 76 89 92
    Rose   76 98 99 100
    Jack   89 70 95 80
    
    awk '{total=$2+$3+$4+$5;Avg=total/4}{printf "%-10s%-8d%-8d%-8d%-8d%-0.2f\n",$1,$2,$3,$4,$5,Avg}' student.txt
    
    awk 'BEGIN{printf "%-10s%-8s%-8s%-8s%-8s%-8s\n","Name","Math","English","Chinese","Physical","Avg"}{total=$2+$3+$4+$5;Avg=total/4}{printf "%-10s%-8d%-8d%-8d%-8d%-0.2f\n",$1,$2,$3,$4,$5,Avg}' student.txt
    
awk条件语句
  • 打印passwd文件第3列大于50小于100的值
    awk 'BEGIN{FS=":"}{if($3>50 && $3<100) print $0}' /etc/passwd
    
  • awk文件形式
    # script.awk
    
    BEGIN{
        FS=":"
    }
    {
        if($3<50)
        {
            printf "%-28s%-25s%-5d\n","小于50的uid",$1,$3
        }
        else if($3>50 && $3<100)
        {
            printf "%-25s%-25s%-5d\n","大于50且小于100的uid",$1,$3
        }
        else
        {
            printf "%-28s%-25s%-5d\n","大于100的uid",$1,$3
        }
    }
    
  • 引用 script.awk
    awk -f script.awk /etc/passwd
    
awk循环语句
  • while 循环

    # cat while.awk
    
    BEGIN{
    
        while(i<=100)
        {
            
            sum+=i
            i++
        }
        print sum
    
    }
    
  • do while 循环

    # 语法
    do 
      {
       动作
      }while(条件表达式)
     
    # do_while.awk
    
    BEGIN{
        do
        {  
            sum+=i
            i++
        }while(i<=100)
        print sum
    }
    
  • for 循环

    # 语法
    for(i=0;i<=100;i++)
    {
    	动作
    }
    # for.awk 
    BEGIN{
        for(i=0;i<=100;i++)
        {
            sum+=i
        }
        print sum
    }
    
  • awk案例
    需求:给表格添加表头,并新增Avg列,打印平均成绩>85的列,求出满足条件的成绩和

    cat> student.txt<<EOF
    Allen  90 80 77 85
    Joe    88 76 89 92
    Rose   76 98 99 100
    Jack   89 70 95 80
    EOF
    
    BEGIN{
            printf "%-10s%-10s%-10s%-10s%-10s%-10s\n","Name","Math","English","Chinese","Physical","Avg"
        }
        {
            total=$2+$3+$4+$5
            Avg=total/4
            if(Avg>85)
            {
                printf "%-10s%-10d%-10d%-10d%-10d%-0.2f\n",$1,$2,$3,$4,$5,Avg
                # 每遍历一行保留一个值
                score_math+=$2
                score_english+=$3
                score_chinese+=$4
                score_physical+=$5
            }
    }
    END{
            printf "%-10s%-10d%-10d%-10d%-10d\n","",score_math,score_english,score_chinese,score_physical   
    }
    # 输出
    Name      Math      English   Chinese   Physical  Avg
    Joe       88        76        89        92        86.25
    Rose      76        98        99        100       93.25
              164       174       188       192
    
字符串函数
  • 内置

    length(str): 计算长度 
    index(str1,str2): 返回在str1中查询到的str2的位置 
    tolower(str): 小写转换 
    toupper(str): 大写转换 
    split(str,arr,fs): 分隔字符串,并保存到数组中 
    match(str,RE): 返回正则表达式匹配到的子串的位置 
    substr(str,m,n): 截取子串,从m个字符开始,截取n位。n若不指定,则默 
    sub(RE,RepStr,str): 替换查找到的第一个子串 
    gsub(RERepStr,str): 替换查找到的所有子串   
    
  • 以:为分隔符,返回/etc/passwd中每行中每个字段的长度

    # simple_1.twk
    BEGIN{
        FS=":"
    }
    {
        i=1
        while(i<=NF)
        {   
            if(i==NF)
                printf "%d",length($i)
            else
                printf "%d:",length($i)
            i++
        }
        print ""
    
    }
    
  • 搜索字符串"I have a dream"中出现"ea"字符串的位置

    awk 'BEGIN{str="I have a dream";location=index(str,"ea");print location}'
    
  • 将字符串"Hadoop is a bigdata Framawork"全部转换为小写

    awk 'BEGIN{str="Hadoop is a bigdata Framawork";low_str=tolower(str);print low_str}'
    
  • 将字符串"Hadoop is a bigdata Framawork"全部转换为大写

    awk 'BEGIN{str="Hadoop is a bigdata Framawork";up_str=toupper(str);print up_str}'
    
  • 将字符串"Hadoop Kafka Spark Storm HDFS YARN Zokeeper",按照空格为分隔符,分隔每部分保存到数组中

    awk 'BEGIN{str="Hadoop Kafka Spark Storm HDFS YARN Zokeeper";split(str,arr," ");for(a in arr) print arr[a]}'
    
  • 搜索字符串"Tranction 2345 Start:Select*from master"第一个数字出现的位置

    awk 'BEGIN{str="Tranction 2345 Start:Select*from master";location=match(str,/[0-9]/);print location}'
    
  • 截取字符串"transaction start"的子串,截取条件从第4个字符开始,截取5位

    awk 'BEGIN{str="transaction start";print substr(str,4,5)}'
    
  • 替换字符串"Tranction 243 Start,EventID:9002"中第一个匹配到的数字串为$符号

    awk 'BEGIN{str="Tranction 243 Start,EventID:9002";sub(/[0-9]+/,"$",str);print str}'
    
  • 替字符串"Tranction 243 Start,EventID:9002"中所有匹配到的数字串为$符号

    awk 'BEGIN{str="Tranction 243 Start,EventID:9002";gsub(/[0-9]+/,"$",str);print str}'
    

6. 故障处理

poweroff 关机慢问题
Error: dracut Warning: Cannot umount  /oldroot
# 解决方法
Solutions: dracut  -f
crictl 使用报错

报错:

ERRO[0000] validate service connection: validate CRI v1 runtime API for endpoint "unix:///var/run/dockershim.sock": rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial unix /var/run/dockershim.sock: connect: no such file or directory"

解决:

cat >> /etc/crictl.yaml<<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
systemctl restart containerd

ubuntu安装kvm

  • 检测是否支持安装
# 大于0表示支持
egrep -c '(vmx|svm)' /proc/cpuinfo
  • 安装
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
  • 加载
sudo modprobe kvm
  • 将当前用户加入(不使用sudo即可管理虚拟机)
sudo usermod -aG libvirt $(whoami)
  • 启动
sudo systemctl enable libvirtd.service --now
  • 验证
kvm-ok

安装uefi模式虚拟机

  • 创建磁盘
qemu-img create -f qcow2 /data/kvm/kvm01.qcow2 15G
  • 安装支持uefi的模块
sudo apt -y install ovmf
  • 安装
virt-install --name=kvm01 --os-type=linux --os-variant=rhel7.0  --vcpu=2 --ram=3072 --disk path=/data/kvm/kvm01.qcow2 --graphics spice --cdrom=/home/user/CentOS-7-9.iso --network network=default --boot uefi
  • 配置开启console连接(centos)
# 在要连接的虚拟机上配置
grubby --update-kernel=ALL --args="console=ttyS0"

克隆虚拟机

#!/bin/bash
kvm_xml_dir=/home/user/kvm
kvm_old_disk=`virsh dumpxml ${1} |grep "<source file"|awk -F"'"  '{print $2}'`
kvm_disk_dir=`dirname ${kvm_old_disk}`
# 复制磁盘
cp -p ${kvm_old_disk}  ${kvm_disk_dir}/${2}.qcow2
# 通过已存在的虚拟机生成新的虚拟机配置文件
virsh dumpxml ${1} >${kvm_xml_dir}/${2}.xml
# 更改虚拟机配置
sed -i '/<uuid>/d' ${kvm_xml_dir}/${2}.xml
sed -i '/<mac address/d' ${kvm_xml_dir}/${2}.xml
sed -ri "s#(<name>)(.*)(</name>)#\1${2}\3#g" ${kvm_xml_dir}/${2}.xml
sed -ri "s#(<source file=')(.*)('/>)#\1${kvm_disk_dir}/${2}.qcow2\3#g" ${kvm_xml_dir}/${2}.xml
# 定义虚拟机
virsh define ${kvm_xml_dir}/${2}.xml
# 开启虚拟机
virsh start ${2}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值