linux常用工具指令

时间:2022-7-29     作者:smarteng     分类: Linux命令


本文先介绍常用的 Linux 工具包,第二部分介绍我个人在平常使用Linux时,用到的一些指令和技巧,其中不包括特别基础的,大多为“用了可以省时省力,不使用也能有别的方法绕过”的技巧。
第二部分持续整理中,8月10日前整理好...
文中的指令,大部分在 Linux 和 MacOS 上都可用,少部分在 Mac OS 上可能不兼容。

一、常用工具包介绍

1.1 Bash 内置指令

Bash (Bourne-Again SHell) 是一个满足 POSIX 规范的 shell。查看手册可以看到 Bash 完整的介绍: man bash
常用的 Bash 内建指令包括:

  • 管道符 |
  • 条件表达式说明 [[ expression ]]
  • for 循环, if 分支,特殊判断 -a file
  • 字符引用时的特殊符号
  • 特殊变量,如 BASHPWD
  • 重定向, /dev/tcp/host/port
  • 环境变量
  • 特殊符号输入,比如:Ctrl + d 表示 EOF,
  • 快捷键,比如:Ctrl + a 到行首,Ctrl + e 到行尾,Ctrl + r/s 反向/正向搜索历史指令
  • alias , set , unset
  • cd , dirs , echo , cat , history , pushd , popd , pwd
  • ulimit , umask

1.2 Core Utilities

GNU 发布的核心工具箱,包含的指令列表详见 coreutils wiki 以及官网介绍,可以使用 yum 直接安装: yum install coreutils
平时操作的大部分 shell 命令行,都来自于这个工具箱。这里简单罗列一下其中包含的命令:

  • 通用工具: chmod , chown , chroot , cp , dd , df , du , ln , ls , mkdir , mv , rm , rmdir , touch
  • 文本/shell 工具: basename , cat , comm , cut , dirname , echo , expand, unexpand , false , fmt , fold , head , join , md5sum , paste , pr , seq , sleep , sort , split , tail , tee , test / [ ] , tr , true , uniq , wc , yes
  • 系统工具: date , env , groups , hostname , id , nice , pwd , su , uname , who , whoami
  • 其他用的较少的: chgrp , cksum , csplit , dir , dircolors , expr , factor , hostid , install , link , logname , mkfifo , mknod , nl , nohup , od , pathchk , pinky , printenv , printf , ptx , shred , stty , sum , sync , tac , tsort , tty , unlink , users , vdir

1.3 util-linux

util-linux 是 Linux 内核组织发布的一套工具,完整的命令字列表可以参考 Util-linux#Included。我们日常用到这个工具箱中的命令字有: cal , fdisk , ipcs , kill , last , more , mount , dmesg , umount 等。

1.4 procps-ng/procps

系统和进程监控工具箱,主要是将 /proc 伪文件系统下的信息,进行可视化的展示或者设置。完整指令列表详见 procps wiki
ng 表示下一代,可能是之前的工具没人维护了,然后新拉分支就加个 ng,之前 util-linux 也有 ng,最后又合并回了 util-linux。
这里列举该工具箱中的指令: free , kill , pgrep , pkill , pmap , ps , pwdx , skill , slabtop , snice , sysctl , tload , top , uptime , vmstat , w , watch 等。

1.5 binutils

GNU 维护的二进制文件工具箱。包括

  • 常使用: ld , as , ar , gprof , nm , objdump , readelf , strings , strip
  • 不太常使用: addr2line , c++filt , dlltool , gold , nlmconv , objcopy , ranlib , size , windmc , windres

1.6 moreutils

类似于 core utilities,该库提供了一些比较基础的命令,比如可以查询错误码的 errno ,可以并发执行任务的 parallel ,可以只利用一个文件进行处理的 sponge ,使用逻辑符比较和处理文本的 combine
其他的指令还有: chronic , ifdata , ifne , isutf8 , lckdo , mispipe , pee , sponge , ts , vidir , vipe , zrun
详细说明可以参考官网介绍和具体的使用示例

1.7 网络相关

net-tools 是常用的网络工具箱,包括: ifconfig , hostname , route , nameif , iwconfig , iptunnel , netstat , arp 等指令。
目前,功能更全面的 ip 指令被用来替换上述多个指令,前者来自于 iproute2utilip 指令表示上述指令的参数可以参考 iproute2 wiki
tcpdump 用于网络抓包,而 tshark 是 Wireshark 的命令行工具,用于分析包。

1.8 Glibc - ldd

Glibc 不是工具库,而是 GNU/Linux 系统的核心 API 库,比如 open , read , write , malloc , printf , getaddrinfo , dlopen , pthread_create , crypt , login , exit 等基础功能函数。同时,Glibc 提供了一个 ldd 的命令,用于打印动态库的依赖,也可以使用 ldd -v 来查看 Glibc 的版本。

1.9 包管理工具

通过一些包管理软件,我们就能方便的安装上一些我们常用的工具。
不同发行版本相关的: yum , apt , dnf , pkg , brew
不同语言相关的: pip , npm , go

1.10 图片/视频库

我在协助客户端同学排查问题的过程中,也用到了一些图片视频相关工具箱。
ImageMagick:该工具箱提供方便的进行图片和视频的信息获得、转换、比较指令,我主要用到 convert 命令,其他指令详见命令行说明
FFmpeg:该工具箱用来提供视频的格式转换、截取等功能。

二、脚本中常用技巧

2.1 判断操作系统

$OSTYPE 可以用于脚本中的判断操作系统

if [[ "$OSTYPE" == "linux-gnu" ]]; then
        # ...
elif [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac OSX
elif [[ "$OSTYPE" == "cygwin" ]]; then
        # POSIX compatibility layer and Linux environment emulation for Windows
elif [[ "$OSTYPE" == "msys" ]]; then
        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
elif [[ "$OSTYPE" == "win32" ]]; then
        # I'm not sure this can happen.
elif [[ "$OSTYPE" == "freebsd"* ]]; then
        # ...
else
        # Unknown.
fi

2.2 在管道之间添加注释

netstat -lanp                `# `                          | \
grep -P '(tcp|udp)'          `# ignore unix domain socket` | \
grep -v LISTEN               `# ignore LISTEN port`        | \
awk '{print $5}'             `# print down stream IP`      | \
grep -v "::1"                `# ignore ipv6 localhost`     | \
grep -v "127.0.0.1"          `# ignore ipv4 localhost`     | \
grep -v ":::\*"              `# ignore ipv6 any ip:port`   | \
grep -v "0.0.0.0:\*"         `# ignore ipv4 any ip:port`   | \
grep -v -P "119.254.0.\d*"   `# ignore link local address` | \
grep -v ":12300$"            `# ingnore onion system`

2.3 使用数组并遍历

## declare an array variable
declare -a arr=("element1" "element2" "element3")

## now loop through the above array
for i in "${arr[@]}"
do
   echo "$i"
   # or do whatever with individual element of the array
done

# You can access them using echo "${arr[0]}", "${arr[1]}" also

2.4 读文件行

while read p; do
  echo "$p"
done <peptides.txt

2.5 赋值

  • = 是最基本的赋值
  • := 是覆盖之前的值
  • ?= 是如果没有被赋值过就赋予等号后面的值
  • += 是添加等号后面的值

https://phoenixnap.com/kb/linux-commands-cheat-sheet

2.6 脚本中的特殊流程

set -e 含义是当命令发生错误的时候,停止管道或脚本的执行
set -x 作用是把将要运行的命令用一个 + 标记之后显示出来

2.7 传递外部变量到脚本中

COLUMNS=$COLUMNS my_script

2.8 脚本获取 flag 参数

The basic syntax of getopts is (see: man bash ):
getopts OPTSTRING VARNAME [ARGS...]
where:

  • OPTSTRING is string with list of expected arguments,

  • h - check for option -h without parameters; gives error on unsupported options;

  • h: - check for option -h with parameter; gives errors on unsupported options;

  • abc - check for options -a , -b , -c ; gives errors on unsupported options;

  • :abc - check for options -a , -b , -c ; silences errors on unsupported options;

    Notes: In other words, colon in front of options allows you handle the errors in your code. Variable will contain \?` in the case of unsupported option, `:` in the case of missing value.`

  • OPTARG - is set to current argument value,

  • OPTERR - indicates if Bash should display error messages.

a_flag=''
b_flag=''
files=''
verbose='false'

print_usage() {
  printf "Usage: ..."
}

while getopts 'abf:v' flag; do
  case "${flag}" in
    a) a_flag='true' ;;
    b) b_flag='true' ;;
    f) files="${OPTARG}" ;;
    v) verbose='true' ;;
    *) print_usage
      exit 1 ;;
  esac
done

三、文件格式校验、转换

校验 XML 文件是否有效

利用 xmlint 工具,如果 XML 文件不合法,则将会产生标准输出

xmllint --format demo_n_idip.xml > /dev/null
echo $?

格式化 JSON

利用 jq 指令,格式化 JSON 输出,也可以做校验

cat timeout.log  | jq
echo $?

去掉UTF8 BOM

sed -i '1s/^\xEF\xBB\xBF//' orig.txt

ImageMagick 图片处理

图片转PDF

yum install 
# `apt-get install imagemagick` on Ubuntu
convert *.jpg -auto-orient pictures.pdf

查询图片大小

convert example.png -print "Size: %wx%h\n" /dev/null

四、网络相关

tcpdump

抓 pcap 文件,可以使用 Wireshark 分析
tcpdump -i any -s 65535 tcp port 80 -w xx.pcap

tshark

tshark -r 983_MonthlyCalendar.QueryPackage.new.pcap -Y "tcp.stream eq 0 and http2.streamid eq 6121" -T fields -e http2.data.data > temp.bin

ws

安装 websocket tool
go get -u github.com/hashrocket/ws
使用
ws ws://127.0.0.1:1323/ws

curl

统计一次请求的不同阶段的耗时:
curl -o /dev/null -s -w %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}"\n" "http://www.36nu.com"
-o , --output : 指定下载文件
-v , --verbose : 查看请求和返回的详细信息

防火墙

firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload

五、文件路径相关

创建临时文件/文件夹

mktemp -d XXXX -p /tmp/
mktemp -d /tmp/XXXX
mktemp -q pic-XXXX

-d 是文件夹的,不带是文件。

查看隐藏目录文件的大小

du -hs .[^.]*

六、文件内容处理

查找哪些文件不包含指定的内容

grep 使用选项 -L, --files-without-match 可以找到不匹配的文件:
grep -L title *

paste

grep -o -P "\|serial\|[^\|]*\|" ready.txt | awk -F'|' '{print $3}' > f1a.txt
grep -o -P "\|_ams_serial_\|[^\|]*\|" ready.txt | awk -F'|' '{print $3}' > f1b.txt
paste -d"\t" f1a.txt f1b.txt > f1.txt

join

shuf

会将文件中的行随机打乱,可以用于将文件快速分成训练集和验证集

七、Bash 输出

数字补0

https://stackoverflow.com/questions/8789729/how-to-zero-pad-a-sequence-of-integers-in-bash-so-that-all-have-the-same-width

seq -f "%05g" 10 15    # 生成补0的序列
printf "%05d\n" $i     # 打印补0的数字
printf -v j "%05d" $i  # 存储补0的数字

强制刷管道缓冲

按照行缓冲
stdbuf -oL /some/command &amp;> some_log.log
无缓冲
stdbuf -o0 /some/command &amp;> some_log.log

日期时间转换

打印当前时间戳
date +%s
将时间戳转换成时间
date -d@1635131675
根据时间字符串获得时间戳
date --date='2022-06-28 12:40:00' +"%s"

八、进程状态相关

向进程发送信号

查看所有信号对应的数值
kill -l
查看信号的具体含义
man 7 signal

信号值含义查询

kill -l  # 列出所有能通过kill发送的信号
kill -l 9  # 查询指定信号值的含义

错误码含义查询

errno -l  # 查看所有错误码
errno 11  # 查看指定错误码

会返回:

EAGAIN 11 Resource temporarily unavailable

errno 指令在 moreutils 包中,如果如果需要使用,可能需要使用 yum install moreutils 进行安装。

九、系统状态相关

top

按照内存排序

top 的展示默认是按照 CPU 排序的,如果想按照内存(%MEM),有几种方式可以操作:

  • press shift+m after running the top command
  • or you can interactively choose which column to sort on
  • press Shift+f to enter the interactive menu
  • press the up or down arrow until the %MEM choice is highlighted
  • press s to select %MEM choice
  • press enter to save your selection
  • press q to exit the interactive menu

ps 带详细启动时间

ps -eo pid,lstart,cmd

  1. 修复获取client_ip逻辑
  2. 调整部分签名相关代码

查看被OOM Killer 杀掉的进程

dmesg -T | egrep -i 'killed process' -T, --ctime - Print human-readable timestamps.

十、资源控制

cgroups

cgcreate -g cpu:/tlog
cgset -r cpu.cfs_period_us=1000000 tlog
cgset -r cpu.cfs_quota_us=100000 tlog
cgexec -g cpu:tlog ./a.out &amp;

系统参数设置

显示所有系统参数:
sysctl -a
设置core文件命名模式:
sysctl -w kernel.core_pattern=core

网络相关参数

/proc/sys/net/ipv4/* 目录中的变量说明,可以参考这个链接
调整接收/发送缓冲区大小:

sysctl -w net.core.rmem_default=26214400
sysctl -w net.core.rmem_max=26214400

sysctl -w net.core.wmem_max=67108864
sysctl -w net.core.wmem_default=67108864

调整 socket监听的backlog上限

sysctl -w net.core.somaxconn=65535
sysctl -w net.core.tcp_max_syn_backlog=262144
sysctl -w net.core.netdev_max_backlog=3000000

调整TCP使用内存页数(第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限):
sysctl -w net.ipv4.tcp_mem='758316 1011092 1516632'
调整client端口范围:
sysctl -w net.ipv4.ip_local_port_range="32768 61000"
其他一些常用参数:

net.ipv4.tcp_tw_reuse
net.ipv4.tcp_fin_timeout
net.ipv4.tcp_syncookies
net.ipv4.tcp_tw_recycle
net.ipv4.tcp_no_delay_ack

调整 TCP/IP 栈传输队列大小

ifconfig eth1 txqueuelen 10000