Shell基础命令

Shell基础命令

date 时间

date "+%F %T"
date "+%Y-%m-%d %H:%M:%S"
date "+%Y%m%d-%H%M%S"
date '+%F%n%T'

# 2023-02-04 11:31:57.963
date "+%Y-%m-%d %H:%M:%S.%3N"

# 时间戳:秒级别
date '+%s'
# 时间戳:毫秒级别
date '+%s%3N'

# 计算时间差
echo $((time2-time1))

tail

# tail命令默认是10行

# 查看最后10行
tail -n 10 filename
tail -10 filename

# 实时查看后10行
tail -n 10 -f filename
tail -10f filename

# 第10行开始,一直到最后
tail -n +10 filename
# 示例
t_start=$(grep -n '111' 'zzz.txt' | awk -F ':' '{print $1}')
tail -n +${t_start} filename

# 日志查看(某一天的第一条日志)
grep -n '2022-08-08' xxx.log | head -1
# 文件最后三行(带行号)
cat -n xxx.log | tail -3

less

# 显示行号
less -N file
# 从第100行开始显示
less -N +100 file

# d 下一页
# u 上一页
# ?xxx 向上查找
# /xxx 向下搜索
# n 下一个
# N 上一个
# q 退出
# g 跳到首行
# G 跳到底部

find

# 示例
find '文件夹' -type f -iname 'xxx' 2>/dev/null | wc -l
ls -lht $(find '/' -type f -name '*.log' 2>/dev/null) | less -N
find '/' -type f -name '*.log' 2>/dev/null | xargs ls -lht --time-style=long-iso
find '/' -type f -name '*.log' -ls 2>/dev/null
find `pwd` -name '*.sh'


# 指定多个文件夹
find '文件夹1' '文件夹2' -type f -name 'xxxxx'
# 多个文件名,or连接
find / -name '文件名1' -o -name '文件名2'
# 多条件过滤(以.log结尾,不含java)
find / -name '*.log' ! -name '*java*'
# 排除文件夹
find / ! -path '/proc/*' -name 'xxxx'

# 文件小于1M(c、k、M、G)
-size -1M
# 文件大于1M
-size +1k
# 文件等于1k
-size 1k
# 10M - 1G 之间
-size +10M -size -1G

# (访问时间atime、修改内容时间mtime、更改时间ctime)其中ctime包括更改位置权限等都算
# 3天以内
-mtime -3
# 3天以上
-mtime +3
# 3分钟以内
-mmin -3
# 3分钟以上
-mmin +3

# 查找权限为644的文件或目录(需完全符合)
-perm 644
# 查找所有者为tzz的文件或目录
-user tzz
# 查找组名为gname的
-group gname

# 遍历深度
-mindepth 3
-maxdepth 5

# 空文件夹
find -empty

# 忽略大小写
find -iname 'xxxxx'

# 列出系统中10分钟内修改过的日志文件
ls -ltr $(find '/' -type f -name '*.log' -mmin -10 2>/dev/null)

# 查找包含某个类的jar包
find / -name '*.jar' 2>/dev/null -exec grep -Hls '类的全路径' {} \;
# -exec使用
find . -name '*' 2>/dev/null -exec echo {} \;
find . -name '*' 2>/dev/null -exec echo {} \; -exec realpath {} \;

# 查找包含指定内容的文件
find /xxx -type f -name '*.log' 2>/dev/null | while read line; do
    [ $(grep -m1 'xxxxx' ${line} 2>/dev/null | wc -l) -gt 0 ] && echo ${line}
done

# 查找包含指定扩展名文件的文件夹
find /xxx -type d 2>/dev/null | while read line; do
    [ $(ls -l ${line}/*.jar 2>/dev/null | wc -l) -gt 0 ] && echo ${line}
done

ls

alias ll='ls -lh --time-style=long-iso --color=auto'
ls -lhtr --time-style=long-iso --color=auto

ls -ltr
ls -lSr
ls -lX
ls -ldp $(find `pwd` 2>/dev/null)
ls -ldp $(find `pwd` -type f 2>/dev/null) | wc -l
ls -1 | xargs realpath

# 拼接为绝对路径
realpath *

# -t 时间倒序
# -S 文件大小排序
# -X 以扩展名排序
# -r 反向排序
# -R 递归获取子目录
# -h 以合适的大小显示
# -d 只显示目录(如果是目录,不展开显示子文件)
# -i 显示索引
# -F 各种文件类型末尾添加标识
# -p 目录的结尾显示/
# -g 不显示所有者
# -G 不显示群组
# -o 不显示群组
# -a 显示隐藏文件
# -A 显示隐藏文件,不显示./和../
# -1 换行显示
# -l 长格式

# --time-style=long-iso
# --color=auto(蓝色:目录、绿色:可执行文件、红色:压缩文件、浅蓝色:链接文件、灰色:其他文件)
# --block-size=K(K、M、G、T)

# --time-style=long-iso (2021-10-02 18:01)
# --time-style=iso (10-02 18:01)
# --time-style='+%Y/%m/%d %H:%M:%S' (2021/10/02 18:01:17)

grep

# 某一时间之后的日志
grep -A5000 '2023-01-01 14:00' filepath | less

# 多个单词查询
grep -iE 'aaa|bbb|ccc' filepath

# 查找包含指定字符串的文件
find / -name '*.sh' 2>/dev/null -exec grep -Hls '关键字' {} \;

# 原字符匹配(取消正则表达式)
grep -F '[2023-01-01]' filepath

# 只显示正则表达式匹配的字符 参数-o
ifconfig | grep -oE '([0-9]+\.){3}[0-9]+'


# -n 显示行号
# -i 忽略大小写
# -v 选择不匹配的行
# -c 只输出匹配行的数量,而不是匹配的内容
# -H 在输出中包含文件名(搜索结果单个时,也会带上文件名)
# -l 仅列出包含匹配项的文件名
# -L 列出不包含匹配项的文件名
# -m 匹配几个后停止
# -w 匹配单词
# -o 只显示匹配到的那部分内容,而非整行
# -E 使用正则表达式
# -s 不显示错误信息
# -a 或 --binary-files=text

# -B 前面几行
# -A 后面几行
# -C 前后几行


# 匹配整数
grep -oE '[0-9]+' filepath
# 匹配浮点数
grep -oE '[0-9]+(\.[0-9]+)?' filepath

zgrep

-l 或 --files-with-matches:仅仅列出包含匹配行的文件名,而不是打印匹配行。
-c 或 --count:仅仅输出匹配行的数量,而不是具体内容。
-h 或 --no-filename:在输出时不要打印匹配行所在的文件名。
-i 或 --ignore-case:忽略大小写差异。
-n 或 --line-number:在输出匹配行时,同时显示行号。
-q 或 --quiet 或 --silent:安静模式,不输出匹配的行,仅返回退出状态(0表示匹配,1表示不匹配)。
-r 或 --recursive:递归搜索指定目录下的所有文件(包括子目录)。

注意: zgrep还可以识别bz2、xz等其他类型的压缩文件,只要系统中安装了对应的支持工具(如bzgrep、xzgrep)。在许多现代Linux系统中,zgrep会自动识别文件类型并调用正确的解压缩工具。

ps

ps -aux
ps -ef

# lstart 启动时间
ps -eo pid,user,lstart,cmd | grep xxxxx
# etime 启动总时长
ps -eo pid,user,etime,cmd | grep xxxxx
# 综合使用
ps -eo pid,lstart,user,etime,%cpu,%mem,cmd | grep xxxxx

# CPU占用前10
ps -aux --sort=-%cpu | head
# 内存占用前10
ps -aux --sort=-%mem | head
# 根据PID查看CPU和内存占用
ps -p 9999 -o pid,%cpu,%mem

# 获取进程PID
ps -ef | grep xxxxx | grep -v grep | awk '{print $2}'
pidof xxxxx

# top命令按进程查看
top -p 9999
# top命令执行一次
top -b -n 1 | head
top -b -n 1 -p 9999 | tail -2
# 备注:top页面,按下shift+M按内存排序,按下shift+P按CPU排序,按回车键手动刷新

# 查看进程环境变量
cat /proc/${PID}/environ | tr '\0' '\n' | grep -i xxxx

文件权限

chown user filename
chgrp group filename
chmod 777 filename

# -R参数 修改文件夹下所有的(可以省略group)
chown -R user: filepath
chown -R user:group filepath

# -R 递归,文件夹和子文件夹以及文件

列切割

# 111出现的行数
grep -n '111' zzz.txt | awk -F ':' '{print $1}'
grep -n '111' zzz.txt | cut -d ':' -f 1

# 从第3个字符开始切割,直到最后
grep -n '111' zzz.txt | cut -c3-
# 截取前10个字符
grep -n '111' zzz.txt | cut -c 1-10

解压缩

zip与unzip

# zip默认是追加模式,不会覆盖原有的文件

# zip压缩目录
zip -r xxx.zip /root/xxxx/
# zip压缩多个文件
zip -r xxx.zip file1 file2
zip -r xxx.zip $(find . -name '*.log' 2>/dev/null)

# 解压到当前目录
unzip xxx.zip
# 解压到指定目录
unzip xxx.zip -d /root/target

# 查看zip中的文件(不解压)
zip -sf xxx.zip
unzip -l xxx.zip

# demo
temp_arr=(aaa.txt bbb.txt ccc.txt)
zip -r xxx.zip ${temp_arr[*]}
#压缩当前文件夹下的文件
zip -r "xxxxx_$(date '+%Y%m%d_%H%M%S').zip" *

tar

tar -zxvf xxxxx.tag.gz -C /home/xxxx
tar -xvf xxxxx.tag -C /home/xxxx

-x:表示解压
-z:表示通过gzip解压缩
-v:显示过程中的信息
-f:指定文件名
-C:指定解压到的目录

-c:压缩
-r:追加
-t:列出归档文件的内容
-P:不使用绝对路径,仅保存相对路径信息。
-p:保留文件的权限和所有权信息。
-exclude=PATTERN:排除符合模式的文件。

-z:通过 gzip 进行压缩或解压缩(扩展名为 .tar.gz)
-j:通过 bzip2 进行压缩或解压缩(扩展名为 .tar.bz2)
-J:通过 xz 进行压缩或解压缩(扩展名为 .tar.xz)

tar -czf /home/xxxxx.tar.gz --exclude=.git --exclude=.idea xxxxx1 xxxxx2 xxxxx3

gunzip和gzip

  • gunzip 实际上是 gzip 的一个别名,gzip 可以通过 -d 参数执行解压缩操作,即 gzip -d file.txt.gzgunzip file.txt.gz 效果相同,都会解压文件。
  • 当你使用 gunzip 时,它默认执行解压缩操作;而 gzip 默认执行压缩操作,但可以通过 -d 选项切换为解压缩。
# 解压缩单个文件并删除原压缩文件
gunzip xxxxx.gz
# 解压缩文件并保留原压缩文件(-k)
gunzip -k xxxxx.gz

# 递归解压缩目录中所有的.gz文件:
gunzip -r directory/


# 压缩文件(会删除原有文件)(生成file.txt.gz)
gzip file.txt
# -k 或 --keep:保留原文件,在压缩后不会删除源文件
gzip -k file.txt

-f 或 --force:强制压缩或解压缩,即使文件已经存在或者设置了只读属性。
-9 或 --best:使用最高压缩比,虽然耗时较长,但是能获得最佳压缩效果。
-v 或 --verbose:显示详细信息,包括压缩比和压缩速度。

scp 文件传输

# (下载)将远程192.168.1.10机器上的/home/ubuntu/test.txt文件复制到当前目录下
scp ubuntu@192.168.1.10:/home/ubuntu/test.txt .

# (上传)将本地当前目录下的文件复制到远程(-r参数表示递归)(目标机器文件夹不存在时会自动创建)
scp -r . ubuntu@192.168.1.10:/home/ubuntu/
scp -P22 -r . ubuntu@192.168.1.10:/home/ubuntu/

-r  递归复制整个目录
-p  保留原文件的修改时间,访问时间和访问权限
-P  port:注意是大写的P, port是指定数据传输用到的端口号
-q  不显示传输进度条。
-v  详细方式显示输出。

历史命令 history

echo $HISTSIZE
HISTSIZE=3000
history | less -N

netstat 端口号相关

netstat -anp | grep -w LISTEN

netstat -ntlp | grep :8080
netstat -ntlp | grep java

netstat -anp | grep ':8080'
netstat -anp | grep java

watch周期执行

watch -n 3 -d 'ps -ef | grep java'

# -n 3 每3秒执行一次,默认值是2秒。(支持小数写法,比如 -n 0.1表示0.1s执行一次)
# -d 高亮显示每次变化的差异
# -t 关闭顶部的说明

# 每0.1s执行一次
watch -n 0.1 'date'

watch ls -l
watch -d ls -l
watch -n 1 'date "+%F %T"; ps -p 9999 -o pid,%cpu,%mem;'

curl

curl -i -k -XGET "https://www.baidu.com"
curl -i -k -XPOST "https://www.baidu.com" -H 'Content-Type:application/json' -d '{"key":"value"}'

# 下载文件
curl http://www.example.com/example.zip -o example.zip

### 常用参数
# -i 在输出中包含HTTP头信息
# -k 忽略SSL证书验证
# -X 指定HTTP方法,如GET、POST、PUT等
# -v 显示详细信息
# -H 自定义HTTP头部信息
# -d 指定HTTP POST请求的数据;
# -o 指定输出文件名;
# -s 静默模式,不显示进度信息;
# -L 跟随重定向

# --insecure 或 -k:忽略SSL证书验证。
# --cert <certificate[:password]>:客户端证书文件和密码。
# --cacert <CA certificate>:指定CA证书文件。

# -m 或 --max-time <seconds>:最大处理时间限制。
# --retry <num>:失败后重试次数。
# --retry-delay <seconds>:重试之间的延迟。

重定向

# 1是标准输出、2是标准错误输出
command 1>file
command 2>file
# 1和2全部打印到file
command &>file
# 1和2分开打印
command 1>file1 2>file2

# 追加模式
&>>file

expect 自动化交互套件

# 示例:登录root用户
[[ $(whoami) != 'root' ]] && expect -c '
    set timeout 5
    set password "123456"
    spawn su - root
    expect "*assword*" {send "${password}\r"}
    expect "#" {send "clear\r"}
    expect "#" {send "date; whoami\r"}
    interact
'

# interact 停留在当前页面

用户相关

w
who
whoami

# 查看 大于500的用户
cat /etc/passwd | while read line; do
    [ $(echo ${line} | cut -d ':' -f 3) -gt 500 ] && echo ${line} | cut -d ':' -f 1,3
done

查看Linux系统信息

# 操作系统位 (x86_64或arm)
arch
uname -m

uname -a

# 查看环境变量
env | less -N

stat命令

# 自定义格式
stat -c "%a %U:%G  %n" *

# 查看文件修改时间
stat filename
stat filename | grep 'Modify'
stat -c %y filename
date -r filename

# 查看文件所有者和属组
stat -c %U:%G filename
# 查看文件权限(数字形式)
stat -c %a filename

lsof

# lsof(list open files)是一个列出当前系统打开文件的工具
lsof
# 按进程pid查看打开的文件
lsof -p $pid | grep REG
# 当前文件夹下文件句柄情况
lsof +c0 +d . | grep REG
lsof +c0 +D $PWD | grep -E 'COMMAND|REG'
# 文件句柄泄露的
lsof | grep -i deleted

# +c0 会把COMMAND列显示全

# -a:列出打开文件存在的进程,表示两个参数都必须满足时才显示结果(and的意思)。
# -c<进程名>:列出指定进程所打开的文件。注意,此处的参数后面可以跟上一个正则表达式。
# -g:列出GID号进程详情。
# -d<文件号>:列出占用该文件号的进程。
# +d<目录>:列出目录下被打开的文件。
# +D<目录>:递归列出目录下被打开的文件。
# -n<目录>:列出使用NFS的文件。
# -i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
# -p<进程号>:列出指定进程号所打开的文件。
# -u:列出UID号进程详情。
# -h:显示帮助信息。
# -v:显示版本信息。

awk

# 打印ip
ifconfig | awk '$1=="inet" {print $2}'

# 示例:
awk '{print(NR,$0)}' filename
awk '{print("%-5d %s\n",NR,$0)}' filename

# 打印最后一行
awk 'END{print}' filename

# 最长行
awk '(NR==1||length(min)>length()){min=$0}END{print min}' data.txt
# 最短行
awk '{if (length(max)<length()) max=$0}END{print max}' data.txt

# 待整理 https://blog.csdn.net/weixin_39825722/article/details/109998571

tr命令

# 转大写
echo 'AaBbCc' | tr [a-z] [A-Z]
# 转小写
echo 'AaBbCc' | tr [A-Z] [a-z]

# 查看进程环境变量
cat /proc/${PID}/environ | tr '\0' '\n' | grep -i xxxx

# 参考:
# https://blog.csdn.net/rangewudi/article/details/77385928
# https://blog.csdn.net/qq_43309149/article/details/104345121

磁盘与内存

# 查看磁盘
df -h
# 查看内存
free -h
top

# 查看某个目录或文件的大小(-s相当于-d0)
du -hs `pwd`
du -hs /root/
du -hd0 /root/
# 查看文件夹下面子文件的大小(-d相当于--max-depth)
du -hd1 /root/
du -hd1 `pwd`

du -d1 / | sort -rn

文件校验 md5sum 和 sha1sum

md5sum xxxxx
sha1sum xxxxx

# Windows下
certutil -hashfile xxxxx MD5
certutil -hashfile xxxxx SHA1
certutil -hashfile xxxxx SHA256

sleep

sleep 1     # 延时一秒
sleep 1s    # 延时一秒
sleep 1m    # 延时一分钟
sleep 1h    # 延时一小时
sleep 1d    # 延时一天

sleep 0.5   # 延时0.5秒(500毫秒)

# usleep 以微秒为单位

bash相关

# 查看当前用户的默认bash
echo $SHELL
# 查看当前终端所使用的bash
echo $0
# 展示所有可用的bash
cat /etc/shells
# 修改ossusr用户的默认bash为/bin/bash
sudo usermod -s /bin/bash ossusr
# 临时使用某个bash(输入bash路径直接回车即可)
/bin/bash

# 其他
chsh -s /bin/bash

# 使用指定用户执行指定命令
su - ossusr -c "whoami"
# 在指定机器上执行命令
ssh -o ServerAliveInterval=30 -o StrictHostKeyChecking=no ubuntu@192.168.1.1 'whoami;pwd;'

time

time命令用于测量命令执行时间和资源消耗情况

time command args...

real:命令从开始到结束所花费的总时间(包括其他进程使用CPU的时间)。
user:命令在用户空间(用户态)执行所花费的时间。
sys:命令在内核空间(内核态)执行系统调用所花费的时间。

timeout

timeout 是Linux系统中的一个命令,用于设定一个命令的执行时间限制。如果指定的命令在指定时间内没有完成,timeout会强制终止该命令。这个命令常用于防止长时间运行且可能陷入无限循环的程序,或者是当执行的命令不应占用过多系统资源时。

timeout [OPTIONS] TIMEOUT_COMMAND [ARGUMENTS]

TIMEOUT:指定命令的最大运行时间,可以是绝对时间(例如:10s、5m、2h分别表示10秒、5分钟、2小时)或者相对于当前时间的相对时间(例如:+10表示10秒后)。
COMMAND:你要运行并设置超时限制的命令。
ARGUMENTS:传递给命令的参数。

选项
-k SECS:在到达超时时间后,等待SECS秒后才杀掉进程,允许进程做一些清理工作。
-s--signal SIGNAL:指定超时后发送的信号,默认是SIGTERM,可以是任何有效的POSIX信号名称或号码。
-v 或 --verbose:显示超时命令的详细信息。
-p 或 --preserve-status:如果命令在规定时间内完成,则传递其退出状态,否则返回超时状态。
-h 或 --help:显示帮助信息。

示例:
timeout 30s ping google.com  # 限制ping命令最多运行30秒
timeout --foreground 10m command-that-runs-long  # 前台运行命令,并在10分钟后强制结束
timeout -k 5 60 command  # 如果command在1分钟内没结束,发出警告并在5秒后强制结束

定时任务

# 查看当前用户的定时任务
crontab -l

# 定时任务配置路径(参考)
/var/spool/cron/root
# 日志
/var/log/messages

sudo

在Linux系统中,sudo 是一个允许授权用户执行一些或全部root命令的程序,它提供了一种灵活的方式来管理系统权限,增强了系统的安全性。以下是关于如何配置 sudo 的一些基本步骤和概念:

  1. 编辑 /etc/sudoers 文件

要配置 sudo,你需要编辑 /etc/sudoers 文件。这个文件控制着哪些用户可以使用 sudo,以及他们可以执行哪些命令。由于直接编辑这个文件可能会导致系统无法使用 sudo,推荐使用 visudo 命令来安全地编辑它。visudo 会在保存更改前检查语法错误。

sudo visudo
  1. 添加用户到 sudoers

默认情况下,sudo 组的成员可以在提示密码后执行 sudo 命令。要允许某个用户使用 sudo,只需将该用户添加到 sudo 组中:

sudo usermod -aG sudo username

这里,username 是你想要赋予 sudo 权限的用户的用户名。

  1. 定制权限

/etc/sudoers 文件中,你可以为特定用户或组设置更详细的权限。基本格式如下:

username ALL=(ALL:ALL) NOPASSWD:ALL
  • username: 用户名或用户组名。
  • ALL: 该规则适用的所有主机(如果有多个主机,可以指定主机名)。
  • (ALL:ALL): 用户可以以任何用户身份(第一个ALL)在任何用户组(第二个ALL)中执行命令。
  • NOPASSWD: 允许该用户无需密码执行 sudo 命令。
  • ALL: 用户可以执行所有命令。

注意: 设置 NOPASSWD 应谨慎,因为它允许用户无需输入密码就执行 sudo 命令,可能降低系统安全性。

  1. 限制可执行的命令

如果你不想给用户完全的 sudo 权限,可以限制他们只能执行特定的命令。例如,允许用户 username 仅能执行 apt-get updatereboot 命令:

username ALL=(ALL) NOPASSWD:/usr/bin/apt-get update, /sbin/reboot
  1. 保存并退出

visudo 中编辑完毕后,保存并退出(通常是通过 :wq 命令,如果你使用的是 Vim 编辑器)。visudo 会检查语法错误,如果一切正常,更改将被应用。

总结

通过以上步骤,你可以有效地管理和定制 sudo 权限,增强系统的安全性并合理分配管理权限。记得在进行任何更改时都要小心,避免意外锁定自己或其他重要账户的 sudo 权限。

作者博客首页:https://blog.csdn.net/qq_43111676?type=blog
持续更新中…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值