Linux笔记

Linux

镜像站

  • 阿里镜像站
  • suse替换源

  • 更新zypper源
  • Suse用zypper安装时设置网易源
  • Linux中引号的区别

    单引号:
    单引号会忽略所有的命令和特殊字符,即将整个引号内的内容完全当做字符串内容来处理;

    str=t
    echo '${str}' #输出内容为 ${str}
    

    双引号
    双引号会解析引号内的特殊字符,如果需要输出特殊字符则需要在特殊字符前使用\来进行转义;

    str=t
    echo${str}#输出内容为“t”
    echo\${str}#输出内容为“${str}”
    

    反单引号:
    释义:
    反单引号(backquote),又称反引号,是西文字符中的附加符号,主要用于计算机相关领域。位置在键盘中数字键“1”的左边,其上档符号是“~ ”,使用Shift键可以换挡输入。
    作用:
    反单引号的作用是将引号内容作为命令来执行;与$(command)类似;

    str=`ulimit -n`
    echo $str #输出1024
    

    常用命令

    组件命令安装

  • 阿里镜像源(里面有配置指引)
  • Packages for Linux and Unix
  • apt & apt-get 安装

    在ubuntu下使用 apt-get install 或 apt install 下载安装软件,软件下载及安装后的目录:
    A、下载的软件的存放位置:/var/cache/apt/archives
    B、安装后软件的默认位置:/usr/share
    C、可执行文件位置:/usr/bin
    D、配置文件位置:/etc
    E、lib文件位置:/usr/lib

    apt-get update
    apt install numactl
    apt install sudo
    apt install vim
    apt-get install openssl
    apt-get install libssl-dev
    apt-get install dialog
    apt-get install whiptail
    apt-get install psmisc
    

    apt-get卸载docker引擎

    echo 'Y'|apt-get remove docker docker-ce docker-engine  docker.io containerd runc
    echo 'Y'|apt-get purge docker-ce
    echo 'Y'|apt-get purge docker-ce-cli
    echo 'Y'|apt-get purge containerd.io
    
  • apt 和 apt-get 之间有什么区别?
  • dpkg

    dpkg是一个Debian的一个命令行工具,它可以用来安装.删除.构建和管理Debian的软件包。

    安装软件命令行:
    dpkg -i <.deb file name>示例:

    dpkg -l #显示所有已经安装的Deb包,同时显示版本号以及简短说明
    dpkg -i containerd.io_1.4.9-1_amd64.deb #安装软件命令dpkg -i <.deb file name>
    dpkg -R /pkgs #安装一个目录下面所有的软件包, 命令行会自动处理文件夹下包的依赖关系
    dpkg --unpack containerd.io_1.4.9-1_amd64.deb #释放软件包,但是不进行配置,如果和-R一起使用,参数可以是一个目录 dpkg --unpack -R /pkgs
    dpkg --configure containerd.io_1.4.9-1_amd64.deb # 如果和-a一起使用,将配置所有没有配置的软件包
    dpkg -r docker-ce #删除软件包,保留其配置信息
    dpkg -L docker-ce #显示一个包安装到系统里面的文件目录信息命令行:dpkg -L packageName
    dpkg -P docker-ce #删除一个包
    
    

    查看操作系统信息

    查看操作系统版本
    uname -a #Linux查看版本当前操作系统内核信息
    cat /proc/version
    lsb_release -a
    cat /etc/issue
    cat /etc/redhat-release
    
    #如果是docker容器内查看容器的操作系统,需要使用以下命令,否则看到的都是宿主机的操作系统信息
    cat /etc/issue
    
    查看系统架构
    arch #x86输出x86_64; arm输出aarch64
    

    查看硬件信息

    lshw查看所有硬件摘要信息
    lshw #和dmidecode一样,输出一大堆的东西
    lshw | grep /dev/sdb -A5 -B5 #查看sdb磁盘信息
    lshw -html >info.html #以html格式输出
    lshw -xml >info.xml #以xml格式输出
    lshw -json >info.json #以json格式输出
    lshw -short #显示设备列表,输出包括设备路径(path)、类别(class)以及简单描述
    lshw -businfo #显示设备列表,输出包括总线信息、SCSI、USB、IDE、PCI地址等
    #显示指定类别的设备 # lshw -C class # lshw -class class 这里的class可以通过lshw -short来查看。比如 # lshw -C memory
    
    cpu相关

    使用lscpu命令可以查看cpu的信息;
    linux查看物理CPU个数: grep “physical id” /proc/cpuinfo|sort -u|wc -l
    linux查看逻辑CPU个数: cat /proc/cpuinfo |grep “processor”|sort -u|wc -l
    linux查看每个物理CPU内核个数: grep “cpu cores” /proc/cpuinfo|uniq

    lsblk查看块设备信息
    lsblk
    lsblk -help
    lsblk -o NAME,FSTYPE,MOUNTPOINT,UUID,SIZE 
    lsblk -b -J -o NAME,FSTYPE,MOUNTPOINT,UUID,SIZE #按照json格式输出对应字段信息
    
    lspci查看PCI设备信息
  • Linux:lspci命令介绍
  • lsusb查看USB接口设备信息

    内存相关

    Linux下可以通过命令free -lh查看内存情况;也可以使用cat /proc/meminfo命令查看内存情况;

    清理缓存cache释放内存:

    echo 1 > /proc/sys/vm/drop_caches
    echo 2 > /proc/sys/vm/drop_caches
    echo 3 > /proc/sys/vm/drop_caches
    

    磁盘相关

    lsblk
    lsblk
    lsblk -help
    lsblk -o NAME,FSTYPE,MOUNTPOINT,UUID,SIZE 
    lsblk -b -J -o NAME,FSTYPE,MOUNTPOINT,UUID,SIZE #按照json格式输出对应字段信息
    
    fdisk
    fdisk -l #查看磁盘情况
    
    #用fdisk 对磁盘进行分区(小于2T的盘)
    fdisk /dev/sdb
    #输入m,可以查看命令操作
    #输入p 查看当前硬盘分区,目前没有分区
    #输入n新建一个分区,输入p 建立分区,输入分区编号 1
    #然后会让你设置开始扇区,我填的是开始扇区2048,结束,20480
    #最后输入w,回车保存
    
    parted

    用parted对磁盘进行分区(大于2T的盘)

    echo yes | parted /dev/sdm mklabel gpt 
    parted /dev/sdm mkpart 1 ext4 1 2T
    parted /dev/sdm mkpart 2 ext4 2T 4T 
    parted /dev/sdm mkpart 3 ext4 4T 100% 
    

    说明:
    mklabel gpt为分区表格式
    mkpart 1为分区名称
    ext4 1 2T为ext4分区格式,从1开始,到2T结束
    100%剩余空间给分区

    查看分区信息
    parted -s /dev/sdi print

    参考:

  • 分区工具parted的详解及常用分区使用方法
  • du、df等命令

    linux查看目录空间磁盘占用:
    df -lh 查看磁盘挂载情况
    du -sh 目录名 (当前存在文件累加)
    du -sh * 当前目录下所有的目录和文件列表空间占用
    du -h --max-depth=1 --exclude=/data / 统计/目录下除/data以外的目录的容量情况

    格式化

    格式化磁盘:
    mkfs -t ext4 /dev/sdd
    echo y | mkfs -t ext4 /dev/sdb

    挂载
    mount /dev/sdb /test #挂载磁盘到目录,但是重启服务器后会失效,需要执行下面的步骤设置开机自动挂载
    echo -e "$diskName $path ext4 defaults 0 0" >> /etc/fstab #设置开机自动启动,使用diskName的模式有时候重启服务器后,名称会变动,建议使用uuid挂载
    echo -e "/dev/sdb /test ext4 defaults 0 0" >> /etc/fstab
    echo -e "$diskUuid $path ext4 defaults 0 0" >> /etc/fstab #设置开机自动启动,diskUuid可以通过blkid /dev/sdb命令来查看
    echo -e "UUID=8dd01439-0feb-472e-a1f8-c8e5d663060e /test ext4 defaults 0 0" >> /etc/fstab
    
    解除挂载
    umount /dev/sdb #根据磁盘解除挂载
    umount /test #根据目录解除挂载
    umount -lf /dev/sdb #强制分离卸载,在提示device is busy时使用;
    

    说明:
    -l: lazy umount , detach the filesystem now, clean up things later(现在分离文件系统,稍后清理) 针对解除挂载时出现device is busy错误时,就可以使用该参数;
    -f: force unmount (in case of an unreachable NFS system) 强制卸载(在无法访问NFS系统的情况下)

    raid相关

    查看raid信息
    cat /proc/mdstat

    停止raid
    mdadm -vS /dev/md166

    删除raid
    mdadm --remove /dev/md166

    进程线程相关

    lsof

    lsof(list open files)是一个列出当前系统打开文件的工具。在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以,lsof的功能很强大。一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,但是普通用户执行会显示“permission denied”。因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

    pidof

    fuser

    fuser 是Linux上的一个命令,用以由文件或设备去找出使用文件、或设备的进程。该命令列出本地进程的进程号,那些本地进程使用File 参数指定的本地或远程文件。对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程。
    fuser [ -c | -d | -f ] [ -k [i] [信号] ] [ -u ] [ -x ] [ -v ] 文件/目录
    fuser [-umv] [-k [i] [信号]] 文件/目录

    -c 包含 File的文件系统中关于任何打开的文件的报告。
    -d 暗示使用了 -c 和 -x 标志。关于任何与文件系统(自父目录删除的)无链接的打开文件的报告。当与 -V 标志一起使用时,它也会报告被删除文件的节点号和大小。
    -f 仅对文件的打开实例报告。
    -k 将 SIGKILL 信号发送到每个本地进程。仅有 root 用户能终止另一用户的进程。
    -u 为进程号后圆括号中的本地进程提供登录名。
    -V 提供详细输出。
    -x 与 -c 或 -f 连用,报告除标准 fuser 输出以外的可执行的和可载入的对象。
    -u:除了列出进程的PID之外,还列出该进程的拥有者
    -m:后面接的那个文件名会主动地上提到该文件系统的最顶层,对umount不成功有效
    -v:可以列出每个文件与进程还有命令的完整相关性
    -k:找出使用该文件/目录的进程,并试图以-9这个信号给予该进程(就是终止正在使用这个文件的进程)
    -i:必须与-k配合使用,在删除PID之前会先询问使用者的意愿
    信号:就是前面提到过的信号,-1、-15等,若不加的话,默认为-9

    ps

  • 查看进程使用的文件(命令:fuser、lsof、pidof)
  • 网络相关

    测试网络
    ping 192.168.1.118
    #运行服务端
    iperf -s -i 1 -f M
    #运行客户端进行网络测速
    iperf -c 192.168.1.118 -i 1 -t 60 -f M -w 500K
    #测试网络丢包
    iperf3 -c 192.168.1.118 -t 100 -i 1 -u -b 1000
    iperf3 -s -i 1
    
    
    sar监听网络流量
    apt install sysstat
    利用sar命令,加上-n DEV参数,即可统计出所有网卡上的流量,在显示的第五和第六列,显示的是接收到的数据流量和发送的数据流量,单位是kB/s,即每秒多少千字节。后面的2 10是指每2秒报告一次,共报告10次。
    sar -n { DEV | EDEV | NFS | NFSD | SOCK | ALL }
    sar 提供六种不同的语法选项来显示网络信息。-n选项使用6个不同的开关:DEV | EDEV | NFS | NFSD | SOCK | ALL 。DEV显示网络接口信息,EDEV显示关于网络错误的统计数据,NFS统计活动的NFS客户端的信息,NFSD统计NFS服务器的信息,SOCK显示套接字信息,ALL显示所有5个开关。它们可以单独或者一起使用。
    sar -n DEV 2 10
    01:39:40 AM     IFACE   rxpck/s   txpck/s   rxbyt/s   txbyt/s   rxcmp/s   txcmp/s rxmcst/s
    01:39:42 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    01:39:42 AM      eth1    131.34    104.98 119704.48 36110.45      0.00      0.00      0.00
    01:39:42 AM      sit0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    IFACE:LAN接口
    rxpck/s:每秒钟接收的数据包
    txpck/s:每秒钟发送的数据包
    rxbyt/s:每秒钟接收的字节数
    txbyt/s:每秒钟发送的字节数
    rxcmp/s:每秒钟接收的压缩数据包
    txcmp/s:每秒钟发送的压缩数据包
    rxmcst/s:每秒钟接收的多播数据包
    
    sar -n EDEV 2 10
    01:42:18 AM     IFACE   rxerr/s   txerr/s    coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
    01:42:20 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    01:42:20 AM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    01:42:20 AM      sit0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
    IFACE:LAN接口
    rxerr/s:每秒钟接收的坏数据包
    txerr/s:每秒钟发送的坏数据包
    coll/s:每秒冲突数
    rxdrop/s:因为缓冲充满,每秒钟丢弃的已接收数据包数
    txdrop/s:因为缓冲充满,每秒钟丢弃的已发送数据包数
    txcarr/s:发送数据包时,每秒载波错误数
    rxfram/s:每秒接收数据包的帧对齐错误数
    rxfifo/s:接收的数据包每秒FIFO过速的错误数
    txfifo/s:发送的数据包每秒FIFO过速的错误数
    
    sar -n SOCK 2 10
    01:44:32 AM    totsck    tcpsck    udpsck    rawsck   ip-frag
    01:44:34 AM       243         9             8             0         0
    01:44:36 AM       242         9             7             0         0
    01:44:38 AM       238         9             7             0         0
    01:44:40 AM       238         9            7             0         0
    totsck:使用的套接字总数量
    tcpsck:使用的TCP套接字数量
    udpsck:使用的UDP套接字数量
    rawsck:使用的raw套接字数量
    ip-frag:使用的IP段数量
    
    curl

    curl可以进行http请求;
    其中POST为请求方法;
    -H部分为Header内容
    -w “time_total: %{time_total}” 为对请求时间;

    curl -w "time_total: %{time_total}" -XPOST 'http://localhost:9999/test' -H "Content-Type: application/json" -d'
    {
    "id": "123"
    }'
    

    Linux重启命令

    reboot
    -n : 在重开机前不做将记忆体资料写回硬盘的动作
    -w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
    -d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
    -f : 强迫重开机,不呼叫 shutdown 这个指令
    -i : 在重开机之前先把所有网络相关的装置先停止

    设置开机自动启动

    update-rc.d方式开机启动
    update-rc.d开机启动的详细参数
    update-rc.d [-n] [-f] <basename> remove
    update-rc.d [-n] <basename> defaults
    update-rc.d [-n] <basename> disable|enable [S|2|3|4|5]
    update-rc.d <basename> start|stop <NN> <runlevels>
    -n: not really
    -f: force
    

    备注:
    disable|enable:代表脚本还在/etc/init.d中,并设置当前状态是手动启动还是自动启动。
    start|stop:代表脚本还在/etc/init.d中,开机,并设置当前状态是开始运行还是停止运行。(启用后可配置开始运行与否)
    NN:是一个决定启动顺序的两位数字值。(例如90大于80,因此80对应的脚本先启动或先停止)
    runlevels:则指定了运行级别。
    update-rc.d命令实际只是将对应的脚本连接或者去掉连接到/etc/rcX.d目录下指向/etc/init.d中script的链接(可能存在多个链接文件),update-rc.d只不过简化了这一步骤。

    权限相关

    chmod

    Linux下权限的粒度有拥有者 、群组 、其它组 三种。
    每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。

    给文件或者文件夹赋予权限
    chmod [可选项] <file…>
    参数说明:
    [可选项]

      -c, --changes          like verbose but report only when a change is made (若该档案权限确实已经更改,才显示其更改动作)
      -f, --silent, --quiet  suppress most error messages  (若该档案权限无法被更改也不要显示错误讯息)
      -v, --verbose          output a diagnostic for every file processed(显示权限变更的详细资料)
          --no-preserve-root  do not treat '/' specially (the default)
          --preserve-root    fail to operate recursively on '/'
          --reference=RFILE  use RFILE's mode instead of MODE values
      -R, --recursive        change files and directories recursively (以递归的方式对目前目录下的所有档案与子目录进行相同的权限变更)
          --help		显示此帮助信息
          --version		显示版本信息
    

    [mode]

    # 权限设定字串,详细格式如下 : [ugoa...][[+-=][rwxX]...][,...],
    # u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示所有(包含上面三者)。
    # + 表示增加权限,- 表示取消权限,= 表示唯一设定权限。
    # r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
    

    [file…]

    文件列表(单个或者多个文件、文件夹)
    

    字符权限使用格式示例:

    chmod a+r,ug+w,o-w a.sh b.sh # 设置文件 a.sh 与 b.sh 权限为拥有者与其所属同一个群组 可读写,其它组可读不可写
    

    数字权限使用格式:

    #数字 4 、2 和 1表示读、写、执行权限,即 r=4,w=2,x=1
    #rwx = 4 + 2 + 1 = 7
    #rw = 4 + 2 = 6
    #rx = 4 +1 = 5
    #可以用三个8进制数字分别表示 拥有者User 、群组Group 、其它组Other( u、 g 、o)的权限详情
    chmod 744 test.sh    
    chmod -R 744 test  # -R可以针对文件夹使用,即文件夹下所有的文件和字文件夹都赋予同样的权限;
    
    chown

    更改文件拥有者(chown命令)
    chown [可选项] user[:group] file…
    参数说明:
    [可选项] : 同上文chmod
    user : 新的文件拥有者的使用者
    group : 新的文件拥有者的使用者群体(group)
    示例:

    chown sz:szgroup a.sh b.sh # 设置文件 a.sh b.sh的拥有者设为szgroup 群体的 sz
    chown -R sz:szgroup test # -R可以针对文件夹使用,即文件夹下所有的文件和字文件夹都赋予同样的权限;
    
    chgrp
    sudo

    vi /etc/sudoers
    your_user_name ALL=(ALL) ALL
    然后wq保存退出就可以将your_user_name加入到sudo权限了,
    这样就把自己加入了sudo组,可以使用sudo命令了。
    默认5分钟后刚才输入的sodo密码过期,下次sudo需要重新输入密码,如果觉得在sudo的时候输入密码麻烦,把刚才的输入换成如下内容即可:your_user_name ALL=(ALL) NOPASSWD: ALL

    如果是指定某些命令可以开启sudo,则可以这样:
    jiuling ALL=(ALL) NOPASSWD: /bin/mount, (ALL) NOPASSWD: /bin/umount

    注意: 有的时候你的将用户设了nopasswd,但是不起作用,原因是被后面的group的设置覆盖了,需要把group的设置也改为nopasswd。
    joe ALL=(ALL) NOPASSWD: ALL
    %admin ALL=(ALL) NOPASSWD: ALL

    查找相关

    find命令

    linux下”find“搜索命令;格式:find <指定目录> <指定条件> <指定内容>

    find .| xargs grep -ri "class" #查找文件是否有字符串
    find . -name "*.sh" -print |xargs grep "logs"  #查找当前目录下所有的.sh文件中是否包含logs字段
    find /-name 'DS_service_monitor.sh' #根据文件名查找
    

    参考:

  • find命令查找包含指定内容的文件
  • locate命令

    使用locate搜索linux系统中的文件,它比find命令快。因为它查询的是数据库(/var/lib/locatedb),数据库包含本地所有的文件信息。

    locate docker
    
    type命令

    使用type命令查看系统中的某个命令是否为系统自带的命令。

    type cd
    cd is a shell builtin
    type curl
    curl is /usr/bin/curl
    
    which命令

    使用which命令查看系统命令是否存在,并返回系统命令所在的位置。

    which java
    /usr/local/jdk1.8.0_221/bin/java
    
    whereis命令

    Linux whereis命令用于查找文件。
    该指令会在特定目录中查找符合条件的文件。这些文件应属于原始代码、二进制文件,或是帮助文件。
    该指令只能用于查找二进制文件、源代码文件和man手册页,一般文件的定位需使用locate命令。
    参考:

  • Linux whereis命令
  • 时间日期相关

    设置系统时间

    ubuntu取消自动同步互联网时间: timedatectl set-ntp 0
    ubuntu开启自动同步互联网时间: timedatectl set-ntp 1
    设置操作系统时间: date -s “2018-06-30 00:09:00”

    时间日期转换处理
    curDt=`date +"%Y-%m-%d"` #获取当前系统日期
    t=$(echo "1.620720518375E12" | awk '{printf("%0.0f",$0/1000)}') #将科学计数法的毫秒级的时间戳转为秒级时间戳
    dt=$(date +"%Y-%m-%d %H:%M:%S" -d @$t) #将秒级时间戳转为%Y-%m-%d %H:%M:%S时间
    echo $dt
    dt='2021-05-11 16:08:38'
    echo `date +%s -d "$dt"` #将时间转为秒级时间戳,这里参数dt一定要带上双引号,否则会因为日期和时间之间的空格而报错的,用单引号也会报错
    echo $(date +%s -d "$dt") #将时间转为秒级时间戳,这里参数dt一定要带上双引号,否则会因为日期和时间之间的空格而报错的,用单引号也会报错
    echo `date +%s -d '2021-05-11 16:08:38'` #这个用单引号不会报错
    echo `date +%s -d "2021-05-11 16:08:38"` #这个用双引号不会报错
    dt1=`date +"%Y-%m-%d" -d @$t` #将秒级时间戳转为%Y-%m-%d时间
    echo $dt1
    echo $(date +%s -d $dt1) #将时间转为秒级时间戳,这个参数dt1不加引号也不会报错
    

    Linux date命令可以用来显示或设定系统的日期与时间,在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下:
    时间方面:

    % : 印出 %
    %n : 下一行
    %t : 跳格
    %H : 小时(00..23)
    %I : 小时(01..12)
    %k : 小时(0..23)
    %l : 小时(1..12)
    %M : 分钟(00..59)
    %p : 显示本地 AM 或 PM
    %r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
    %s :197011 日 00:00:00 UTC 到目前为止的秒数
    %S :(00..61)
    %T : 直接显示时间 (24 小时制)
    %X : 相当于 %H:%M:%S
    %Z : 显示时区
    

    日期方面:

    %a : 星期几 (Sun..Sat)
    %A : 星期几 (Sunday..Saturday)
    %b : 月份 (Jan..Dec)
    %B : 月份 (January..December)
    %c : 直接显示日期与时间
    %d :(01..31)
    %D : 直接显示日期 (mm/dd/yy)
    %h : 同 %b
    %j : 一年中的第几天 (001..366)
    %m : 月份 (01..12)
    %U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
    %w : 一周中的第几天 (0..6)
    %W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
    %x : 直接显示日期 (mm/dd/yy)
    %y : 年份的最后两位数字 (00.99)
    %Y : 完整年份 (0000..9999)
    

    若是不以加号作为开头,则表示要设定时间,而时间格式为 MMDDhhmm[[CC]YY][.ss],其中 MM 为月份,DD 为日,hh 为小时,mm 为分钟,CC 为年份前两位数字,YY 为年份后两位数字,ss 为秒数。
    使用权限:所有使用者。
    当您不希望出现无意义的 0 时(比如说 1999/03/07),则可以在标记中插入 - 符号,比如说 date ‘+%-H:%-M:%-S’ 会把时分秒中无意义的 0 给去掉,像是原本的 08:09:04 会变为 8:9:4。另外,只有取得权限者(比如说 root)才能设定系统时间。
    当您以 root 身分更改了系统时间之后,请记得以 clock -w 来将系统时间写入 CMOS 中,这样下次重新开机时系统时间才会持续抱持最新的正确值。

    字符串相关

    去掉字符串后的最后一个字符:

    value="aaa,bbb,"
    value=${value%*,}    #去掉最后面的,号
    #获取文件前缀:	
    ${oldFileName%\.*}
    #获取文件后缀:	
    ${oldFileName#*.}
    

    判断字符串是否为空
    记得变量一定要带上双引号

    if [ -z "$value" ]; then
            echo "value is empty"
    fi
    if [ -n "$value" ]; then
            echo "value is not empty"
    fi
    

    然后如果字符串为null,并非空的情况,需要这样判断

    if [ -z "$value" ] || [ "null" == "$value" ]; then
            echo "value is empty or null"
    fi
    

    sed命令操作

    说明:
    -i:这是 sed 命令的一个选项;默认情况下,sed 打印结果到标准输出。当-i选项时,那么它会修改文件。当添加一个后缀(比如,-i.bak)时,就会创建原始文件的备份。
    s:字母 s 是一个替换命令。
    g:全局替换标志。默认情况下,sed 命令采用替换每一行第一次出现的模式,它不会替换行中的其他的匹配结果。如果有该替换标志时,所有匹配都将被替换。

    获取json字符串中的某个值:

    通过一些命令自行解析简单json:

    local_ip=$(grep -Po 'local_ip[" :]+\K[^"]+' $json) #简单获取,
    local_ip=$(grep -Po 'local_ip[" :]+\K[^"]+' $json | sed 's/\,//g' | sed 's/\}//g' | sed 's/null//g') #如果该字段为空,或者为null,或者处于最后一个字段等情况可以使用该模式获取;
    

    复杂的json还是建议使用jq组件命令解析,不过操作系统可能并没有这个命令,则需要安装这个命令组件;

    result='{"took":7,"timed_out":false,"_shards":{"total":24,"successful":24,"skipped":0,"failed":0},"hits":{"total":2,"max_score":0.0,"hits":[]},"aggregations":{"my_min":{"value":-3.0610224E13,"value_as_string":"-30610224000000"}}}'
    echo $result | jq '.aggregations.my_min.value'
    

    更多jq命令使用参考文章:

  • 处理JSON最强命令jq使用详解
  • 批量替换字符串

    sed -i "s/INFO/debug/g" ${file}  #将所有的INFO替换成debug
    

    将第一个匹配的字符串替换成新字符串

    sed -i '0,/INFO/s//debug/' ${file}  #将第一个INFO替换成debug
    

    根据条件替换整行字符串

    sed -i "s/.*common.my.ip=.*/common.my.ip=${local_ip}/" ${file}
    

    替换某行的某个字符串

    sed -i "2s/INFO/debug/" ${file}  #将第二行的INFO替换成debug
    

    根据条件注释行

    sed -i "s/.*common.my.ip=.*/#common.my.ip=/" ${file}
    

    更多sed命令相关可以参考:

  • 使用sed 命令查找和替换文件中的字符串的方法总结
  • awk

    #wk排除第一行和包含UNASSIGNED字符的内容:   
    awk  'NR!=1'  |  awk  '!/UNASSIGNED/'
    #awk排除第一列后输出其他全部列:     
    awk  '{ $1=""; print $0 }'
    #awk取列数据:   
    awk  '{print $2}'
    #cut取:后第2个数据:	
    cut  -d  :  -f  2
    #去除首尾空格:
    awk '{gsub(/^\s+|\s+$/, "");print}'
    #^\s+ 匹配行首一个或多个空格
    #\s+$ 匹配行末一个或多个空格
    #^\s+|\s+$ 同时匹配行首或者行末的空格
    awk '{gsub(/^\s+|\s+$/, "");print}'
    
    

    grep

    循环

    for i in {1..3};do echo $i;done #从1到3依次循环输出
    for i in {1,3,5};do echo $i;done #循环输出1 3 5
    for i in test{1,3,5};do echo $i;done # 输出test1 test3 test5
    for i in *.sh;do echo $i;done #输出当前目录下的所有sh文件名称
    

    一直循环直到满足某条件

    while :
    do
        sleep 10
        i=$((i+10))
        if [ $i -ge 180  ];then
            break
        fi
    don
    

    循环打印出机器上所有的磁盘

    allDisk=`fdisk  -l | grep Disk | grep "/dev/sd" | awk '{print $2}' | awk '/\//' | sed 's/://' | sort`
    for i in $allDisk
    do
        echo $i
    don
    

    按行便利文件并打印

    cat $file | while read line
    do
        echo $line
    done
    

    备注:
    在利用while read line读取文件时:
    如果文件最后一行之后没有换行符\n,则read读取最后一行时遇到文件结束符EOF,循环即终止。
    虽然,此时$line内存有最后一行,但程序已经没有机会再处理此行内容。因此会导致最后一行内容没有真正的处理;所以可以再文件最后放置一个空行来解决;或者使用这种方式来处理:while read line || [[ -n ${line} ]] 这样当文件没有到最后一行时不会测试-n l i n e ,当遇到文件结束(最后一行)时,仍然可以通过测试 line,当遇到文件结束(最后一行)时,仍然可以通过测试 line,当遇到文件结束(最后一行)时,仍然可以通过测试line是否有内容来进行继续处理。

    读取当前目录下的所有sql文件,并依次循环执行;

    sql_scripts_dir=$(dirname $0)
    for i in ${sql_scripts_dir}/*.sql;
    do
            while read line || [[ -n ${line} ]]
            do
                    echo $line
                    $MYSQL -h localhost -uroot -pSz12Szh --default-character-set=utf8 u2s -e "$line"
            done < $i
    done
    

    系统参数设置

    swap分区(虚拟内存)

    一些操作系统安装的时候,设置了swap交换分区(即虚拟内存,把磁盘的一部分当内存使用);此时,如果java程序等使用内存时,被分配到了虚拟内存上,那么将导致响应速度非常慢,可能会导致极大的问题;所以一般情况下都建议关闭swap分区,或者在安装操作系统的时候不要分配swap分区;

    如果已经设置了swap分区,则可以通过设置系统参数的方式来避免该问题:

    #设置交换分区占比为0(相当于禁用).set the swap point to 0.
    sed -i "/^vm.swappiness.*/d" /etc/sysctl.conf
    echo 'vm.swappiness=0' >> /etc/sysctl.conf
    #刷新参数并生效
    sysctl -p
    

    或者通过取消swap分区挂载的模式来处理:

    sed -ri 's/.*swap.*/#&/' /etc/fstab
    swapoff -a
    mount -a
    

    网络相关参数设置

    相关系统参数的当前值(如果没设置过则是默认值)可以通过cat参数路径 或者 sysctl +项的模式进行查看:
    例如查看端口范围:

    cat /proc/sys/net/ipv4/ip_local_port_range 
    或者 
    sysctl net.ipv4.ip_local_port_range
    

    修改Linux系统网络相关参数,加快端口回收,避免大并发下出现大量TIME_WAIT导致临时端口不够用;

    #开启SYN Cookies; 当出现SYN等待队列溢出时, 启用cookies来处理, 可防范少量SYN攻击; 默认为0, 表示关闭;
    sed -i "/^net.ipv4.tcp_syncookies.*/d" /etc/sysctl.conf
    echo 'net.ipv4.tcp_syncookies=1' >> /etc/sysctl.conf
    #开启重用; 允许将TIME-WAIT sockets重新用于新的TCP连接; 默认为0, 表示关闭;
    sed -i "/^net.ipv4.tcp_tw_reuse.*/d" /etc/sysctl.conf
    echo 'net.ipv4.tcp_tw_reuse=1' >> /etc/sysctl.conf
    #这个参数决定了它保持在FIN-WAIT-2状态的时间; 也可以理解成回收时间, 单位是秒; 
    sed -i "/^net.ipv4.tcp_fin_timeout.*/d" /etc/sysctl.conf
    echo 'net.ipv4.tcp_fin_timeout=30' >> /etc/sysctl.conf
    #刷新参数并生效
    sysctl -p
    

    实际上Windows下也有类似问题,修改注册表内容即可:
    参考如下文章:

  • JMeter Address Already in use 错误解决
  • 其他的一些网络相关参数

    #设置临时端口范围; 默认为32768-60999;
    sed -i "/^net.ipv4.ip_local_port_range.*/d" /etc/sysctl.conf
    echo 'net.ipv4.ip_local_port_range= 10240 60999' >> /etc/sysctl.conf
    #表示系统同时保持TIME_WAIT套接字的最大数量; 如果超过这个数字, TIME_WAIT套接字将立刻被清除并打印警告信息; 默认为180000
    sed -i "/^net.ipv4.tcp_max_tw_buckets.*/d" /etc/sysctl.conf
    echo 'net.ipv4.tcp_max_tw_buckets=5000' >> /etc/sysctl.conf
    #TCP最大连接数
    sed -i "/^net.core.somaxconn.*/d" /etc/sysctl.conf
    echo 'net.core.somaxconn=5120' >> /etc/sysctl.conf
    #表示当keepalive起用的时候, TCP发送keepalive消息的频度; 默认2小时, 改为20分钟;
    sed -i "/^net.ipv4.tcp_keepalive_time.*/d" /etc/sysctl.conf
    echo 'net.ipv4.tcp_keepalive_time=1800' >> /etc/sysctl.conf
    #表示SYN队列的长度; 默认为1024; 加大队列长度为8192, 可以容纳更多等待连接的网络连接数;
    sed -i "/^net.ipv4.tcp_max_syn_backlog.*/d" /etc/sysctl.conf
    echo 'net.ipv4.tcp_max_syn_backlog=8192' >> /etc/sysctl.conf
    
    注意事项

    在网上一些文章中有在优化网络参数的时候使用了net.ipv4.tcp_tw_recycle 和net.ipv4.tcp_timestamps这两个参数,实际上这两个参数较为激进,一些场景下会出现问题,所以需要慎重使用;

  • 网络优化之net.ipv4.tcp_tw_recycle参数
  • Linux的net.ipv4.tcp_timestamps参数
  • net.ipv4.tcp_tw_recycle 和net.ipv4.tcp_timestamps
  • net.ipv4.tcp_timestamps引发的tcp syn无响应案
  • Linux文件最大打开数

    Linux文件最大打开数为1024,可以通过ulimit -n 查看;如果打开的文件句柄数超过了,则会出现问题,此时需要修改Linux的最大文件打开数;
    一般修改可以修改 /etc/security/limits.conf文件,然后添加以下内容:

    * soft nofile 2048
    * hard nofile 2048
    

    其他更多方式可以参考:

  • Linux中如何修改打开文件数量限制
  • 注意事项:
    sysctl中的fs.max-file表示: 系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。
    ulimit -n表示:控制进程级别(比如 Nginx 进程、MySQL 进程)能够打开的文件句柄的数量。提供对 shell 及其启动的进程的可用文件句柄的控制。这是进程级别的。
    文件句柄: 在 Linux 环境中,任何事物都是用文件来表示,设备是文件,目录是文件,socket 也是文件。用来表示所处理对象的接口和唯一接口就是文件。应用程序在读/写一个文件时,首先需要打开这个文件,打开的过程其实质就是在进程与文件之间建立起连接,句柄的作用就是唯一标识此连接。此后对文件的读/写时,目标文件就由这个句柄作为代表。最后关闭文件其实就是释放这个句柄的过程,使得进程与文件之间的连接断开。

    Redis相关参数

    #redis相关的配置项
    sed -i "/^vm.overcommit_memory.*/d" /etc/sysctl.conf
    echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
    

    ElasticSearch相关参数

    # 这个配置es需要,否则启动不了
    sed -i "/^vm.max_map_count.*/d" /etc/sysctl.conf
    echo 'vm.max_map_count=655360' >> /etc/sysctl.conf
    

    数字相关

    echo "1.620720518375E12" | awk '{printf("%0.0f",$0)}' #科学计数法转数字; 1.如果使用%d转为整数会有长度限制,超过8位会溢出;所以使用%0.0f来限制0个小数来实现;2.printf中$1和$0效果一样
    echo "$capacity" | awk '{printf("%0.0f\n",$1*0.95)}' #进行计算并保留0位小数
    echo "1.620720518375E12"|awk '{printf("%.2f",$0)}' #进行计算并保留2位小数
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值