本文是为了巩固自己的基本能力,记录自己使用Linux的常用命令,日积月累,避免每次遇到问题都需要反复去查阅。

之前面试的时候,面试官给我了一些建议,希望我多学习一些Linux的相关操作,我记得重点的内容是 着重于Linux在对于项目开发运维方面需要用到的一些技能,比如有

  • 如何检测系统资源占用。
  • 如何快速的从日志中找到自己需要查看的内容。
  • 如何通过分析工具,比如分析栈帧或者Dump日志来快速的定位到线上问题。

本文的目的包括但不仅限于以上,作为一个程序员,学习使用Linux是我的必经之路。

tar.gz 文件的解压

tar.gz 文件是 Linux 中常见的压缩文件类型,它是通过 tar 进行打包后,再使用 gzip 进行压缩生成的。要解压这个文件,通常会使用 tar 命令,并结合相应的参数来操作。

参数说明

参数 含义 备注
-x 解压缩(extract) 解压缩打包文件(必须参数)
-z 通过 gzip 进行解压缩 用于处理 .gz 格式的压缩文件
-v 显示详细的解压缩过程 可以看到解压缩的文件名,方便查看过程(可选)
-f 指定文件名 后面需要跟上要解压的文件路径(必须参数)
-C 解压到指定目录 指定将文件解压到的目录,而不是当前目录(可选)
--strip-components=n 解压时剥离文件路径的 n 层 可用于只解压文件内容而去除某些路径结构(可选)

启动服务的时候设置服务日志

sudo nohup ./frps -c ./frps.toml > ./frps.logs 2>&1 & 

nohup:不输出信息

>:将标准输出重定向到 ./frps.logs 文件。

2>&1:将标准错误输出也重定向到相同的日志文件。

&:使服务在后台运行。

监控Linux的网络情况

我和朋友们希望可以联机游玩我的世界,最初是在服务器直接部署的服务端,但是受限于服务器内存过小,游玩体验并不好,于是打算使用frp(内网穿透)来将服务器部署在本地电脑上,同时让别人可以访问到。

但其实又出现了新的问题,虽然内网穿透解决了服务器硬件上的大部分问题,但是毕竟存在一个转发的操作。

之前在服务器上直接运行的时候,服务器的网络IO是这样的

image-20240913130006640

后面使用frp后,服务器的网络IO是这样的

image-20240913130014633

内网穿透服务端需要将来自客户端的数据转发给内网穿透客户端,之前的模式总的网络带宽如果是3的话,现在这种模式的网络带宽就是6,几乎翻倍了。

我需要尝试监控服务器带宽的具体使用情况,并尝试扩容。

Linux常见的监控网络情况的命令

ifconfig

[root@iZbp1cygmrq21v08er1kv3Z ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.20.78.230 netmask 255.255.240.0 broadcast 172.20.79.255
inet6 fe80::216:3eff:fe26:f20d prefixlen 64 scopeid 0x20<link>
ether 00:16:3e:26:f2:0d txqueuelen 1000 (Ethernet)
RX packets 17938332 bytes 1814215873 (1.6 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 26725113 bytes 4941505975 (4.6 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 14724 bytes 807866 (788.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14724 bytes 807866 (788.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

这个命令可以看到每个网络接口的IP 地址网络掩码广播地址数据包统计信息但我感觉一般不会用它来看数据包统计信息

参数 说明
interface 指定网络接口的名称(例如 eth0wlan0 等)。
up 启动指定的网络接口。
down 关闭指定的网络接口。
-a 显示所有网络接口的详细信息,包括未激活的接口。
-s 以简要格式显示网络接口的状态信息。
inet addr 设置接口的 IPv4 地址。
netmask 设置接口的子网掩码。
broadcast 设置接口的广播地址。
mtu 设置接口的最大传输单元(MTU)大小。
hw ether 设置接口的 MAC 地址(需要超级用户权限)。
txqueuelen 设置接口的传输队列长度。
pointopoint 设置点对点连接的地址。
promisc 将网络接口设置为混杂模式,接收所有传入的数据包。
-v 显示详细模式输出。
add 为接口添加一个地址。
del 删除接口的地址。
arp 启用或禁用 ARP 协议。
multicast 启用或禁用多播模式。

ip

[root@iZbp1cygmrq21v08er1kv3Z ~]# ip addr show 查看网络接口信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:26:f2:0d brd ff:ff:ff:ff:ff:ff
inet 172.20.78.230/20 brd 172.20.79.255 scope global dynamic eth0
valid_lft 314829262sec preferred_lft 314829262sec
inet6 fe80::216:3eff:fe26:f20d/64 scope link
valid_lft forever preferred_lft forever
[root@iZbp1cygmrq21v08er1kv3Z ~]# ip route show 查看路由表
default via 172.20.79.253 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
172.20.64.0/20 dev eth0 proto kernel scope link src 172.20.78.230

ipifconfig 的替代品,功能更强大。它不仅能查看接口信息,还能查看和配置路由、IP 地址、链路状态等。

参数 说明
ip link 显示或操作网络设备。
ip link set dev [interface] up 启动指定的网络接口。
ip link set dev [interface] down 关闭指定的网络接口。
ip addr 显示或配置设备的 IP 地址。
ip addr add [address] dev [interface] 为网络接口添加 IP 地址。
ip addr del [address] dev [interface] 删除网络接口的 IP 地址。
ip route 显示或操作路由表。
ip route add [route] 添加一条路由规则。
ip route del [route] 删除一条路由规则。
ip route show 显示路由表。
ip neigh 显示或操作邻居(ARP 缓存)。
ip link show 显示网络接口的状态。
ip link set [interface] mtu [value] 设置指定接口的 MTU 值。
ip link set [interface] promisc on 启用接口的混杂模式(接收所有数据包)。
ip addr show 显示所有接口的 IP 地址信息。
ip route flush 清空路由表。
ip tuntap add dev [name] mode [tun/tap] 创建一个 TUN/TAP 设备。
ip maddr 显示或操作多播地址。
ip link set [interface] txqueuelen [value] 设置指定接口的传输队列长度。
ip link set [interface] arp off 禁用 ARP 协议。
ip monitor 监控网络设备、地址和路由的变化。
ip -6 route 显示或操作 IPv6 路由表。

netstat

这个命令还是很好用的,也是我最常用的命令,主要是配合grep来查询占用端口号的进程Pid,与ifconfig和ip不同,这个命令主要是为了实时检测服务器上网络活动和系统上的连接状态

[root@iZbp1cygmrq21v08er1kv3Z ~]# netstat -ntlp | grep 6000
tcp6 0 0 :::6000 :::* LISTEN 18062/./frps
参数 说明
-a 显示所有连接中的 socket,包括监听和非监听状态。
-t 仅显示 TCP 连接。
-u 仅显示 UDP 连接。
-n 以数字形式显示地址和端口号,不进行主机名、端口号的解析。
-l 显示监听中的 socket。
-p 显示使用 socket 的进程 PID 和名称。
-e 显示扩展信息,例如每个连接的用户 ID。
-r 显示路由表。
-s 显示网络统计信息。
-i 显示网络接口列表。
-c 每隔一段时间重复显示信息,直到被中止。
-g 显示多播组成员。
-f 显示网络地址族的信息(例如 inetinet6unix)。
-v 显示详细信息。
-o 显示计时器信息。

ss

ssnetstat 的替代品,它可以更快地显示活动的连接,并提供更详细的信息。

[root@iZbp1cygmrq21v08er1kv3Z ~]# ss -ntlp | grep 6000
LISTEN 0 128 [::]:6000 [::]:* users:(("frps",pid=18062,fd=3))
参数 说明
-a 显示所有连接,包括监听和非监听状态的连接。
-l 仅显示监听中的 socket。
-t 仅显示 TCP 连接。
-u 仅显示 UDP 连接。
-n 不解析服务名称和主机名,直接显示数字 IP 地址和端口号。
-p 显示 socket 相关的进程信息。
-r 显示路由信息。
-s 显示简短的 socket 统计信息。
-e 显示扩展的 socket 信息。
-o 显示计时器信息。
-b 显示套接字使用的字节数。
-i 显示 TCP 内核信息(如内核结构)。
-k 显示内核 socket 表。
-m 显示 socket 内存使用情况。
-4 仅显示 IPv4 套接字。
-6 仅显示 IPv6 套接字。
-f 指定协议族(例如 inetinet6unix)。
-v 显示详细信息。

ping

ping 用于测试与其他主机的网络连通性,发送 ICMP 数据包并等待响应,计算往返时间。

参数 说明
-c count 发送指定数量的请求包。
-i interval 设置发送每个包的间隔时间(秒)。
-s packetsize 设置每个请求包的大小(字节)。
-t ttl 设置发送包的存活时间(TTL,Time To Live)。
-W timeout 设置等待每次回复的超时时间(秒)。
-q 仅显示启动和统计结果,不显示每个 ping 包的输出。
-v 输出详细信息。
-f 测试网络的最大速度(超级用户权限)。
-l preload 在发送请求前发送指定数量的包。
-A 自适应模式,动态调整发送速率。
-n 仅显示 IP 地址,不进行 DNS 名称解析。
-p pattern 设置填充请求包的字节模式(16 进制)。
-I interface 使用指定的网络接口。
-R 记录路由(仅适用于 IPv4)。
-D 为每个包打印发送时间戳。

traceroute

traceroute 追踪数据包在网络中的路径,显示每跳的延迟。

参数 说明
-4 强制使用 IPv4。
-6 强制使用 IPv6。
-d 启用 socket 级别的调试。
-F 不进行分段 (Set the “Don’t Fragment” bit)。
-f first_ttl 设置起始 TTL(默认是 1),用于跳过指定数量的跃点。
-g gateway 设置一个或多个源路由网关(仅限 IPv4)。
-i interface 使用指定的网络接口发送包。
-I 使用 ICMP ECHO 请求代替默认的 UDP 数据包。
-m max_ttl 设置最大的跃点数量(TTL)。
-n 只显示 IP 地址,不进行主机名解析。
-p port 设置目的端口号(默认是 33434,用于 UDP)。
-q nqueries 每个跃点发送的探测包数量(默认是 3)。
-r 忽略普通的路由表,直接发送到本地网络。
-s source_addr 指定发送包的源 IP 地址。
-t tos 设置 IPv4 的服务类型字段(Type of Service)。
-w timeout 设置等待每个响应的超时时间(秒)。
-z send_wait 设置两个探测包之间的时间间隔(毫秒)。
-A 显示 AS(自治系统)号。
-e 显示 ICMP 扩展信息(如 MPLS 标签)。
-T 使用 TCP SYN 包进行探测(通常用于穿越防火墙)。
-U 使用 UDP 包进行探测(默认行为)。

nmap

用于发现网络中的主机、开放端口、操作系统及服务版本等信息,广泛用于网络安全评估与故障排除。

参数 说明
-sP Ping 扫描,只检测哪些主机在线,不进行端口扫描。
-sS SYN 扫描(半开放扫描),最常用的扫描方式之一。
-sT TCP 连接扫描,完全打开 TCP 连接进行扫描。
-sU UDP 扫描,检查目标主机的 UDP 端口。
-p [port(s)] 指定端口或端口范围进行扫描(例如 -p 80-p 20-80)。
-A 启用高级检测,包括操作系统检测、版本检测、脚本扫描和 traceroute。
-O 操作系统检测,尝试识别目标主机的操作系统。
-sV 版本检测,探测目标主机上运行的服务版本。
-T[0-5] 设置扫描速度(0 为最慢,5 为最快)。
-Pn 不进行 ping 扫描,直接进行端口扫描。
-n 不解析主机名,直接使用 IP 地址进行扫描。
-v 显示详细输出,提供更多扫描细节。
-oN [file] 以普通文本格式将扫描结果保存到指定文件中。
-oX [file] 以 XML 格式将扫描结果保存到指定文件中。
-oG [file] 以易于解析的 grepable 格式将扫描结果保存到指定文件中。
--open 只显示开放的端口,不显示过滤或关闭的端口。
-sC 使用默认的脚本扫描。
--script [name] 使用指定的 NSE(Nmap Scripting Engine)脚本进行扫描。
-6 启用 IPv6 扫描。
-f 使用数据包分片,尝试绕过一些防火墙规则。
-D [decoy1,decoy2,...] 使用欺骗技术,隐藏扫描源 IP 地址。
--source-port [port] 使用指定的源端口进行扫描,模拟合法流量。
-iL [file] 从指定文件中读取 IP 地址进行扫描。
-iR [num hosts] 随机扫描指定数量的主机。
--traceroute 扫描后执行 traceroute,显示网络路径。
-S [IP address] 使用指定的源 IP 地址(需要适当的网络权限)。
-g/--source-port [port] 设置源端口,通常用于绕过防火墙或 ID/IPS。
--max-retries [num] 设置在放弃端口扫描前的最大重试次数。
--min-rate [num] 设置扫描的最小传输速率。
--max-rate [num] 设置扫描的最大传输速率。
--script-updatedb 更新 Nmap 的脚本数据库。

tcpdump

tcpdump 是一个抓包工具,用于捕获和分析网络上的数据包。

参数 说明
-i [interface] 指定网络接口来捕获数据包(例如:eth0wlan0)。
-c [count] 捕获指定数量的数据包后停止。
-w [file] 将捕获的数据包写入文件(保存为 .pcap 格式)。
-r [file] 从文件读取并分析之前保存的 .pcap 文件。
-n 不解析主机名,将 IP 地址直接显示为数字格式。
-nn 不解析主机名和端口号(即 IP 和端口号都显示为数字格式)。
-v 显示详细输出。
-vv 显示更详细的输出。
-vvv 显示极为详细的输出。
-X 以十六进制和 ASCII 格式显示数据包内容。
-xx 以十六进制显示数据包的完整内容。
-A 以 ASCII 格式显示数据包内容。
-e 在输出中显示链路层头部信息。
-S 显示绝对序列号而不是相对序列号(用于 TCP)。
-t 不显示时间戳。
-tt 显示自 UNIX 纪元开始的时间戳(秒)。
-ttt 显示时间戳为相对于上一个数据包的时间差(毫秒)。
-q 简洁模式,只显示最基本的信息。
-l 使用缓冲区输出,实时查看捕获的数据包。
-v 显示详细信息,包括 IP 和 TCP 标志。
-F [file] 从文件中读取捕获过滤器表达式。
-d 将匹配表达式编译为可读的代码并输出(用于调试)。
-B [buffer size] 设置捕获缓冲区大小(以 KB 为单位)。
-Z [user] 将权限切换到指定用户。
-C [size] 设置文件大小上限(以 MB 为单位),到达后自动切换到新文件。
-G [seconds] 设置捕获文件切换的时间间隔(秒),到达时间后切换到新文件。
-W [num] 设置保存文件的最大数量,用于循环保存捕获文件。
-U 强制在写入文件时使用未缓冲输出(实时捕获时用)。
-p 禁用网络接口的混杂模式。
host [hostname/IP] 捕获与指定主机通信的数据包。
port [port] 捕获特定端口的数据包。
src [IP] 只捕获来自指定源地址的数据包。
dst [IP] 只捕获发往指定目的地址的数据包。
tcp 只捕获 TCP 数据包。
udp 只捕获 UDP 数据包。
icmp 只捕获 ICMP 数据包(用于 ping 相关的网络活动)。

iftop

iftop 实时监控网络接口上的流量,显示哪些 IP 地址在互相通信,以及数据的流量大小。

参数 说明
-i [interface] 指定监控的网络接口(例如:eth0wlan0)。
-n 直接显示 IP 地址,不解析主机名。
-N 不解析端口名称,直接显示端口号。
-p 将显示置于混杂模式(监控经过接口的所有流量)。
-b 以字节为单位显示带宽,而不是默认的位(bits)。
-B 使用双向流量显示(默认显示的是单向流量)。
-f [filter] 使用 BPF 语法过滤流量(与 tcpdump 类似的过滤表达式)。
-F [net/mask] 显示来自或发往特定网络的流量(例如:-F 192.168.0.0/24)。
-P 显示每个连接的端口号。
-m [limit] 设置最大带宽显示值(例如:-m 100M 表示最大 100 Mbps)。
-c 刷新计数器,而不是滚动输出。
-h 显示帮助信息。
-t 使用文本输出模式,不显示图形界面。
-s [seconds] 指定刷新间隔,默认为 1 秒。
-L [num] 限制显示的最大条目数量。
-Q [num] 设置 PQ 处理队列的深度。
-p 在混杂模式下监听所有网络流量。
-x 显示流量的详细信息。
-u 显示流量方向。
-D 禁用显示 DNS 解析。
TX:             cum:   7.60MB   peak:    248Kb      rates:    241Kb   218Kb   189Kb
RX: 8.30MB 399Kb 395Kb 341Kb 310Kb
TOTAL: 15.9MB 636Kb 636Kb 559Kb 499Kb

TX:发送数据量和速率。

RX:接收数据量和速率。

cum:累计数据量。

peak:历史峰值速率。

rates:显示不同时间段的当前速率

vnstat

vnstat 是一个网络流量监控工具,能够统计并记录每日、每月的网络流量数据。

参数 说明
-i [interface] 指定要查看或监控的网络接口(例如:eth0wlan0)。
-d 显示每日流量统计。
-h 显示每小时流量统计。
-m 显示每月流量统计。
-w 显示每周流量统计。
-t 显示当前日期和时间的流量统计。
-s 显示自上次重启以来的流量统计汇总。
-l 实时流量监控。
--live 实时监控流量,类似于 iftop
--oneline 以一行简洁格式显示统计信息。
-tr [seconds] 实时显示流量信息,时间间隔为指定秒数(例如:-tr 5 监控 5 秒)。
--reset 重置所有流量统计数据。
--enable 启用指定接口的流量监控。
--disable 禁用指定接口的流量监控。
--create 创建新接口的监控数据文件。
--update 强制更新统计数据。
--remove 移除指定接口的流量监控数据文件。
--exportdb 以数据库格式输出统计信息。
--json 以 JSON 格式输出统计信息。
--xml 以 XML 格式输出统计信息。
--delete 删除接口的流量统计数据。
-ru 将流量统计以位(bits)显示而不是字节(bytes)。

ethtool

ethtool 用于查看和修改网络接口的硬件设置,比如速率、双工模式等。

参数 说明
ethtool [interface] 显示指定网络接口的基本信息(例如:速度、双工模式、链接状态等)。
-s [interface] 设置网络接口的参数(如速度、双工模式、自动协商等)。
-a [interface] 显示网络接口的 Pause 参数(流量控制)。
-A [interface] 设置网络接口的 Pause 参数(开启或关闭 RX/TX 流量控制)。
-i [interface] 显示接口的驱动信息。
-d [interface] 获取网络接口的寄存器转储(需要超级用户权限)。
-e [interface] 获取网卡 EEPROM 数据。
-E [interface] 修改网卡 EEPROM 数据(需要超级用户权限)。
-k [interface] 显示接口的卸载(offload)设置(如 TCP 校验和、分段卸载等)。
-K [interface] 启用或禁用接口的特定卸载功能(如:-K eth0 tso off 禁用 TCP 分段卸载)。
-p [interface] [seconds] 使指定接口上的 LED 闪烁,以便物理定位该接口。
-r [interface] 重置网络接口(重新协商)。
-n [interface] 获取网卡的分散/聚合队列数据信息。
-g [interface] 显示网络接口的 RX/TX 环形缓冲区参数。
-G [interface] 设置网络接口的 RX/TX 环形缓冲区参数。
-P [interface] 显示接口的永久 MAC 地址。
-t [interface] 执行网卡自检(针对硬件问题的诊断)。
-S [interface] 显示接口的统计数据。
--show-eee [interface] 显示节能以太网(EEE)参数。
--set-eee [interface] 设置节能以太网(EEE)参数。
--show-coalesce [interface] 显示接口的 coalesce 设置(用于控制中断聚合行为)。
--set-coalesce [interface] 设置接口的 coalesce 参数。
--show-priv-flags [interface] 显示接口的私有标志。
--set-priv-flags [interface] 设置接口的私有标志。
--show-channels [interface] 显示接口的 RX/TX 通道数。
--set-channels [interface] 设置接口的 RX/TX 通道数。

安装软件包

Linux 发行版 包管理工具 更新包列表命令 安装软件命令 删除软件命令 搜索软件命令
Debian/Ubuntu apt sudo apt update sudo apt install package_name sudo apt remove package_name apt search package_name
Red Hat/CentOS yum sudo yum check-update sudo yum install package_name sudo yum remove package_name yum search package_name
Fedora dnf sudo dnf check-update sudo dnf install package_name sudo dnf remove package_name dnf search package_name
Arch Linux pacman sudo pacman -Syu sudo pacman -S package_name sudo pacman -R package_name pacman -Ss package_name
openSUSE zypper sudo zypper refresh sudo zypper install package_name sudo zypper remove package_name zypper search package_name
源码安装 源码编译 手动下载源码包 ./configure && make && sudo make install sudo make uninstall (如有支持) -

文本操作

说到文本操作,其实最主要的命令就是 awk,之前面试官说的在海量的数据中找到需要的数据,应该也是在暗示我关于awk命令。

Linux中有关文档的操作如下

cat

功能:用于显示文件内容,也可以将多个文件合并并输出到终端或其他文件中。

参数 说明
-n 显示每一行的行号,从 1 开始。
-b -n 类似,但只对非空行显示行号。
-s 合并多行空行,只显示一个空行。
-E 在每一行的末尾显示 $,用于区分换行符。
-T 将制表符显示为 ^I,可以帮助区分制表符和空格。
-v 显示非打印字符,除了制表符和换行符。
-A 等同于 -vET,显示非打印字符,显示 $^I
-e 等同于 -vE,显示非打印字符并在行尾显示 $

tac

功能:用于倒序显示文件内容,从最后一行到第一行。

参数 说明
-b 只显示非空白行的行号。
-r 以正则表达式分隔文件内容。
-s 忽略多次重复的分隔符。

功能:用于显示文件的前几行,默认为前 10 行。

参数 说明
-n N 显示文件的前 N 行。
-c N 显示文件的前 N 个字节。
-q 多文件时不显示文件名。

tail

功能:用于显示文件的最后几行,默认为最后 10 行。

参数 说明
-n N 显示文件的最后 N 行。
-f 持续追踪文件更新并显示新增的内容。
-c N 显示文件的最后 N 个字节。

grep

功能:用于搜索文本中符合特定模式的行,支持正则表达式。

参数 说明
-i 忽略大小写进行搜索。
-v 显示不匹配的行(反向匹配)。
-r 递归搜索子目录中的文件。
-n 显示匹配的行及其对应的行号。
-E 使用扩展正则表达式搜索。
-o 只输出匹配的部分,而不是整行。

sed

功能:流编辑器,用于对文件或输入流中的文本进行查找、替换、删除等操作。

参数 说明
-e 允许指定多个编辑命令。
-i 直接在文件中编辑并替换,修改原文件。
-n 只显示被替换或修改的行,而不是所有行。
-r 使用扩展正则表达式。
s/pattern/replacement 替换匹配的文本(第一个)。
s/pattern/replacement/g 替换匹配的文本(全局)
pattern/d 删除匹配的行

s:表示替换操作。

g:表示全局替换,即替换每一行中所有出现的 apple

awk

基本结构

awk 'pattern {action}' file
  • pattern:匹配条件
  • action:对匹配的行执行的操作
  • file:目标文件

打印文件的特定列

awk '{print $1, $3}' file.txt
这将打印文件 file.txt 中的第一列和第三列,默认以空格或制表符作为列分隔符。

根据模式匹配

awk '/pattern/ {print $0}' file.txt
这将打印文件 file.txt 中包含 pattern 的所有行。

条件判断

awk '$2 > 100 {print $1, $2}' file.txt
这将打印第二列大于100的行,并显示第一列和第二列的内容。

使用 BEGIN 和 END 进行前后处理

awk 'BEGIN {print "Start"} {print $1} END {print "End"}' file.txt
BEGIN 块在处理文件之前执行
END 块在处理文件之后执行
中间部分处理文件中的每一行

修改文件的字段分隔符

awk -F ',' '{print $1, $2}' file.csv
使用 -F 来指定分隔符,例如逗号(,)。这可以用于处理CSV文件。

统计文件中的行数

awk 'END {print NR}' file.txt
NR 是一个内置变量,表示当前行号,END 块会在文件处理完之后打印总行数。

求和操作

awk '{sum += $2} END {print sum}' file.txt
将第二列的所有数值求和。

使用变量

awk -v threshold=50 '$2 > threshold {print $1, $2}' file.txt
-v 选项用于定义变量,将 threshold 变量值设置为50,然后用于条件判断。

使用正则表达式

awk '/^a/ {print $0}' file.txt
这将打印所有以 a 开头的行,使用正则表达式匹配行。

排序输出

awk '{print $2, $1}' file.txt | sort -n
将第二列和第一列对调并通过 sort 对第二列进行数值排序。

常用的函数

函数 功能 示例
length([string]) 返回字符串或字段的长度。如果没有参数,返回当前行的长度。 awk '{print length($1)}' file.txt
substr(string, start, [len]) 从字符串的 start 位置开始,提取指定长度的子字符串。 awk '{print substr($1, 1, 3)}' file.txt
index(string, search) 返回 searchstring 中第一次出现的位置,找不到返回 0。 awk '{print index($1, "a")}' file.txt
tolower(string) 将字符串转换为小写。 awk '{print tolower($1)}' file.txt
toupper(string) 将字符串转换为大写。 awk '{print toupper($1)}' file.txt
split(string, array, [del]) 根据分隔符将字符串拆分,并将结果存储在数组 array 中。 awk '{split($1, arr, ","); print arr[1], arr[2]}' file.txt
gsub(regexp, repl, [str]) 全局替换字符串中的匹配项,并返回替换的次数。 awk '{gsub("apple", "fruit", $1); print $1}' file.txt
int(x) 返回 x 的整数部分。 awk '{print int($2)}' file.txt
sqrt(x) 返回 x 的平方根。 awk '{print sqrt($2)}' file.txt
rand() 返回0到1之间的随机数。 awk 'BEGIN {print rand()}'
srand([seed]) 设置随机数生成器的种子,返回旧种子值。 awk 'BEGIN {srand(); print rand()}'
sin(x) / cos(x) 返回 x 的正弦/余弦值。 awk 'BEGIN {print sin(0), cos(0)}'
exp(x) / log(x) 返回 x 的指数/自然对数。 awk 'BEGIN {print exp(1), log(1)}'
strftime([format], [ts]) 格式化时间戳为指定格式。没有时间戳时,使用当前时间。 awk 'BEGIN {print strftime("%Y-%m-%d %H:%M:%S")}'
systime() 返回自1970年1月1日以来的秒数。 awk 'BEGIN {print systime()}'
system(command) 执行系统命令并返回退出状态。 awk 'BEGIN {system("ls -l")}'
NR 当前处理的行号。 awk '{print NR, $0}' file.txt
NF 当前行中的字段数。 awk '{print $1, NF}' file.txt
FILENAME 当前正在处理的文件名。 awk '{print FILENAME, $0}' file.txt

sort

功能:对文件中的行进行排序,默认按字典序排序。

参数 说明
-n 按数字排序。
-r 反向排序。
-k N 以第 N 列作为排序键。
-u 只保留排序后唯一的行(删除重复行)。
-t 指定排序时的字段分隔符。

uniq

功能:过滤文件或输入中的重复行。

参数 说明
-c 统计每行出现的次数,并在输出时显示。
-d 只显示重复的行。
-u 只显示不重复的行。

tr

功能:用于替换或删除输入中的字符。

参数 说明
-d 删除输入中的指定字符。
-s 将重复的字符压缩为一个字符。
A-Z a-z 替换大写字母为小写字母,或相反。

wc

功能:用于统计文件中的字节数、单词数和行数。

参数 说明
-l 只显示行数。
-w 只显示单词数。
-c 只显示字节数。

cut

功能:用于按列提取文件内容。

参数 说明
-f 指定要显示的字段。
-d 指定字段分隔符,默认为制表符。
-b 按字节提取文本。

diff

功能:用于比较两个文件的差异,并显示不同之处。

参数 说明
-u 以统一格式显示文件的差异。
-i 忽略大小写的差异。
-r 递归比较子目录中的文件。