记录以下一下工作常用的Liunx命令。
系统配置与管理部分
systemctl 服务管理命令
$ systemctl status firewalld # 查看服务当前状态
$ systemctl start firewalld # 启动服务
$ systemctl enable firewalld # 设置开机自启动:
$ systemctl disable firewalld # 禁止开机自启动:
$ systemctl restart firewalld # 重新启动服务:
$ systemctl list-units --type=service # 查看所有服务:
dmesge 日志
dmesg 命令主要用来显示内核信息。使用 dmesg 可以有效诊断机器硬件故障或者添加硬件出现的问题。包括 oom 等日志。
# dmesg -T # 人类可读的时间戳
# dmesg -H # 输出更容易读的结果
Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对一般保存在 /var/log 目录下。定位问题可以去里面看看是否有想要的信息,常见的有:
- /var/log/boot.log 开启或重启日志。
- /var/log/cron 计划任务日志
- /var/log/maillog 邮件日志。
- /var/log/messages 该日志文件是许多进程日志文件的汇总
timedatectl 和 date 命令
-
设置时区
# timedatectl list-timezones | grep Shanghai # 查找中国时区的完整名称 Asia/Shanghai # timedatectl set-timezone Asia/Shanghai # 其他时区以此类推
-
获取当前时间的时间戳
# date +%s 1635735286
-
时间戳转换为日期
# date -d @1568271453 Thu Sep 12 14:57:33 CST 2019 # date -d @1568271453 +"%Y-%m-%d %H:%M:%S" # 按照指定日期格式转换 2019-09-12 14:57:33
-
日期转换为时间戳
# date -d '2019-9-12 15:00' +%s 1568271600
-
格式化输出
# date +"%Y_%m_%d" 2023_09_09
-
获取一天以前的日期
# date -d"1 day ago" # 获取前一天 # date -d"a day" # 获取后一天
查看系统启动时间
date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"
查看系统已经运行时间
cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("the system is already running %d days %d hours %d min %d sec\n",run_days,run_hour,run_minute,run_second)}'
查看发行版本
- 查看内核版本
uname -a
关闭防火墙
- centos
systemctl stop firewalld.service systemctl disable firewalld.service
用户管理
-
创建用户
- 添加用户
adduser xxx # 添加用户
- 设置密码
passwd xxx # 设置登录密码
- 添加用户
-
删除用户
# userdel -r hadoop # 删除hadoop用户
-
给用户增加root权限
- centos
- 将sudoers文件的权限修改成可编:
chmod -v u+w /etc/sudoers
- 使用vim编辑/etc/sudoers文件添加如下内容
如需新用户使用sudo时不用输密码,把最后一个找到这一行: root ALL=(ALL) ALL 然后添加: xxx ALL=(ALL) ALL
ALL
改为NOPASSWD:ALL
即可。 - 将sudoers文件的权限修改成不可编辑:
chmod -v u-w /etc/sudoers
- 将sudoers文件的权限修改成可编:
- centos
切换用户
- 查看系统所有用户
# cat /etc/passwd | cut -d: -f1
- 查看当前登录用户
# who
设置 hostname
# hostnamectl set-hostname viros # 设置hostname
修改系统配置sysctl命令
sysctl
命令用于运行时配置内核参数,这些参数位于 /proc/sys
目录下。sysctl
配置与显示在/proc/sys
目录中的内核参数,可以用sysctl
来设置或重新设置联网功能,如IP转发、IP碎片去除以及源路由检查等。用户只需要编辑 /etc/sysctl.conf 文件,即可手工或自动执行由 sysctl 控制的功能。
- 显示系统所有参数
# sysctl -a
- 临时修改某个指定参数的值。
# sysctl -w net.ipv4.ip_forward=1
文件部分
创建/挂载/卸载文件系统
-
mkfs
# mkfs -t xfs /dev/sdb1 #
-
mount
# mount /dev/sdb1 /mnt # 将设备挂载到 /mnt
注意:系统自动挂载的信息记录在/etc/fstab文件中,只有记录到这个文件中的磁盘在系统启动时才会自动挂载。不在这个文件中记录的磁盘挂载了关机后就自动卸载,开机后又需要自己手动挂载。
-
umount
# umount -v /mnt/mymount/
dd命令
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换 。
- 生成一个1M大小的文件
dd if=/dev/zero of=in.txt bs=1M count=1 conv=notrunc 或者 dd if=/dev/urandom of=test.file bs=1M count=1 conv=notrunc
df命令
df
命令的作用是列出文件系统的整体磁盘使用量。
df [-ahikHtm] 目录/文件名
-a:列出所有文件系统
-k:以KB的单位显示 -m:以MB的单位显示 -h:以人们较易阅读的KB,MB,GB的格式显示
-i:不用硬盘容量,而是以inode的数量来显示
-T:连同该分区的文件系统名称(ext3也列出来)
du命令
du 命令会直接到文件系统内部去查找所有的文件数据。
du [-ahskm] 目录/文件名
-a 列出所有的文件与目录容量
-h 以人们较易阅读的格式显示
-s 列出总量
-S 不包括子目录下的总计
-
列出当前目录的大小
du -sh .
-
列出当前目录所有子目录(不包括子目录的子目录)大小
du -h --max-depth=1 .
-
快速查找大文件
du -sh /* | grep G | sort -h
chgrp,chown,chmod 命令。
- 修改文件的所有者:
chown [-R] 账号名称 文件或目录 # [-R] 递归修改
- 修改文件的用户组
chgrp [-R] 账号名称 文件或目录 # [-R] 递归修改
- 修改文件权限
R:4 W:2 X:1
- 数字修改方式
chmod +x [文件或目录] x:xyz之和
- 数字修改方式
- 目录与文件权限的意义
- 权限对普通文件的意义:
-
r
:读取文件的内容。 -
w
: 编辑,修改文件内容。 -
x
: 可以执行。
-
- 权限对目录文件的意义
目录的主要内容是记录文件名列表-
r
: 查询文件名数据 -
w
: 更改目录文件内容的。意思是可以删除目录内文件和新增文件。与x权限配合才可以。 -
x
:代表用户能否进入该目录使之成为工作目录。如果你不具有x权限,那么你不能切换到该目录下,也就无法执行与该目录有关的任何命令。
比如有个目录test: rw-,但mkdir test/tes2等命令会失败,尽管你有w权限。
-
- 权限对普通文件的意义:
local which,where,find命令
-
寻找结构体
grep "keyword" /usr/include/*.h | grep "typedef" grep "keyword" /usr/include/*/*.h | grep "typedef"
-
查找头文件
locate time.h
-
which 命令
根据$PATH
环变量的路径寻找可执行文件which ls # [-a] 将所有由PATH目录可以找的命令均列出,而不只是第一个被找到的命令
-
whereis 命令
whereis命令只能用于程序名的搜索,而且只搜索二进制文件,源代码文件(参数-s)whereis libc
-
find 命令
find [path] [option] [action] option:-atime,-ctime,-mtime find -mtime -n n天以内包括(n)修改过的文件。 find -mtime n n天之前的一天之内修改过的文件。 find -mtime +n n天之前(不包含n)修改过的文件。 option:-uid,-gid,-user ,-nouser,-nogroup find / -user admin 查找根目录下数以admin的文件 ...... option:-name,-size,-type,-perm find -name xx 找到名为xx的文件 find -size [+|-]50[c|k] 找到大小在50 find -perm 权限
- 在指定目录查找指定文件
find . -name abc.txt # 在当前目录查找abc.txt文件
- 查找当前目录下的所有文件
find . -type f
- 查找可执行权限的文件
find . -perm /+x -type f
- 并列查找
find . -name "*.sh" -or -name "*.bat"
- 删除7天以前的日志
find . -mtime +7 -name "xxx.log" -delete
- 在指定目录查找指定文件
zip 和 unzip 命令
- 压缩目录
zip -r dir.zip dir # -q不显示进度
- 解压
unzip server_setup_pack.zip
gzip 和 ugzip 命令
- 压缩
gzip -d filename # 解压文件
- 解压
ugzip xxx.gz
tar 命令
- 压缩并打包
tar -jcv -f dir.tar.bz2 /dir # -j 选择 bzip2 压缩 -v 打包过程中间将处理的文件显示出来 -c 新建打包文件 tar -zcv -f dir.tar.gz /dir # -z 选择 gzip 压缩
- 解压并解包
- tar 后缀的文件解压:
tar -xvf xxx.tar
- tar.gz 后缀的文件解压:
tar -zxvf xxx.tar.gz
- tgz 后缀的文件解压:
tar -zxvf xxx.tgz
- tar.bz2 后缀的文件解压:
tar -jxvf xxx.tar.bz2
- tar 后缀的文件解压:
查看文件内容
- cat
- A 可以用来查看换行符格式,linux是
$
,win是^M$
。
- A 可以用来查看换行符格式,linux是
- tac 逆序打印
- head
- 显示前20行
head -n 20 /etc/man.config
- 显示前20行
- tail
- 打印最后5行
tail -n 5 /etc/man.config
- 打印5行以后的内容
tail -n +5 /etc/man.config
- 打印实时日志
tail -f log # ctrl-s 暂停刷新,ctrl-q继续刷新
- 打印最后5行
- od
od -t x1 hello.pyc
vim部分
移动
- 移动文件指定行:
ngg
,n
表示行号。 - 移动到文件第一行:
gg
- 移动到文件最后一行:
G
- 向下跳转n行:
n + Enter
- 行内快速移动:
w
向左移动一个单词定位在单词头部,b
向右移动一个单词,e
向左移动一个单词,定位在单词末尾。 - 跳转到行首:0
- 跳转到行尾:
$
编辑
- 剪切(删除)一行与多行:
dd
,ndd
- 删除光标到行尾:
D
- 删除第n到第n+m行:
:n,mdd
- 复制一行与多行:
yy
,3yy
- 粘贴:
p
- 撤销:
u
- 在光标所在处另起一行进入编辑模式:
o
- 插入光标所在行的行首:
I
- 插入光标所在行的行尾:
A
- 标识出制表符和行尾:
:set list
,:set nolist
- 删除当前光标所在的单词:
daw
-
dw
从光标当前的位置开始删除,直到删到单词最后 -
bdw
b可以让光标回退到单词开头的位置,而dw则是第1个描述过的命令
选择
- 进入选择行模式:
shift + v
- 全选:先
gg
移动到行首,再shift+g
- 进入选择块模式:
ctrl+v
查找与替换
-
查找
- 从光标出向下开始查找:
/text
查找text,n
向下跳转,N
向上跳转
如果需要并列多个元素查找:/test\|ghj
,表示并列查找 test 和 ghj - 从光标出向上开始查找:
?text
查找text,n
向下跳转,N
向上跳转
- 从光标出向下开始查找:
-
替换
-
作用范围
-
%s
全文范围 -
s
光标所在行 -
n, ms
从第n行到第m行 -
., $s
光标所在行到文末
-
文件编码
- 查看当前文件编码:
:set fileencoding
- 强制使用某种编码打开文件:
:e ++enc=gbk
vimdiff
- 比较2个文件差异:
vimdiff file1 file2
分屏
- 垂直分屏打开2个文件:
vimdiff -o file1 file2
- 横向分屏打开:
:vs filename
- 纵向分屏打开:
:sp filename
- 关闭多个打开的文件:
:qa
vim 配置
vim的全局配置一般是放置在/etc/vimrc
这个文件中,不过,不建议修改它,最好是修改~/.vimrc
这个文件。
:set ts=4
:set expandtab
:set autoindent
:set nu
:set ruler
:set laststatus=2
:set cursorline
syntax enable
less 部分
打开文件
less -N -m [文件名] // N 显示行号,m 显示百分比
常用操作:
-
g
移动到第一行 -
G
移动到最后一行 -
b
向前翻页 -
f
向后翻页 -
j
下一行 -
k
上一行 -
/字符串
向下搜索"字符串" -
?字符串
向上搜索"字符串" -
n
重复*前一个搜索(与 / 成 ? 有关)。 -
N
反向重复前一个搜索(与 / 或 ? 有关) -
shift + F
刷新模式,类似于tail -f
-
ctrl + c
退出刷新模式
文本处理类
grep 命令
-
-i
忽略字符大小写差异 -
-E
使用正则表达式来使用 -
-v
反向选择- 过滤grep本身
比如查找一个进程,会出现grep本身的信息。
可以利用-v grep
将其过滤:
- 过滤grep本身
-
-w
单词精确匹配 - 并列查询
grep -E "abc|dfh" /xx.log # 同时查找abc和dfh
- 上下文查询
grep -C 3 love filename 显示filename文件中,love行上下3行内容(含love行) grep -A 3 love filename 显示filename文件中,love行下3行内容(含love行) grep -B 3 love filename 显示filename文件中,love行上3行内容(含love行)
awk 命令
awk '条件类型1 {动作1} 条件类型2 {动作2}...' filename
NF 每一行拥有的字段数
NR 目前awk所处理的是"第几行"数据
FS 目前的分隔符(默认是空格或tab)
last | head -5 | awk ' { print $1 "\t" $3 } '
last | head -5 | awk ' { print $1 "\t lines: " NR "\t columes: " NF } '
cat /etc/passwd | head -5 | awk ' BEGIN { FS=":" } { print $1 } '
cat /etc/passwd | awk ' BEGIN { FS=":' } $3>2 { print $1 "\t" $3 } '
cat pay.txt | awk 'NR == 1 {
printf "%10s %10s %10s %10s %10s\n", $1, $2, $3, $4, "total" }
NR >= 2 {
total = $2 + $3 + $4;
printf "%10s %10s %10s %10s %10.2f\n", $1, $2, $3, $4, total }
'
awk '{sum+=$0} END {print sum}'
去除字符串两边空格
- 去除字符串两边空格
echo " hello world " | python -c "s=raw_input();print(s.lstrip())"
- 去除字符串前面空格
echo " hello world " | python -c "s=raw_input();print(s.lstrip())"
- 去除字符串尾部空格
echo " hello world " | python -c "s=raw_input();print(s.rstrip())"
cut 命令
-
按分隔符分割字符
# etc/passwd 内容格式:root:x:0:0:root:/root:/bin/bash cat /etc/passwd | cut -d':' -f1
-
去掉前面n个字符
echo "hello world" | cut -c 2- # ello world
-
去掉最后n个字符
echo "hello world" | cut -c -2 # hello wol
sed 命令
sed [-nefr] [动作]
-n 使用安静模式,只打印模式匹配的行
-i 直接修改读取文件的内容,默认选项-e,只在命令行输出,而文件内容不改变
-f sed的动作由一个文件读出
-r sed动作支持扩展型正则表达式语法
动作说明:[n1], [n2] function
function有下面这些参数
a:新增, a后面可以接字符串,而这些字符串会在新的一行出现
c:替换,c的后面可以接字符串,这些字符串会替换n1,n2之间的行
d:删除,因为是删除,所以d后面不接任何参数
i:插入,
s:替换,可以搭配正则表达式,1,20s/old/new/g
eg:
cat -n /etc/passwd | sed '2, 5d' // 删除2-5行
cat /etc/passwd | sed '2a hello world\nihao' // 在第2行后面插入2行
cat /etc/passwd | sed '2,4c hello world\nihao' // 将2,4行替换为指定内容
--n
安静模式
-
打印指定的范围
sed -n '$p' # 打印最后一行 sed -n '2,3p' txt # 打印2,3行的内容 sed -n '2,3!p' txt # 打印除了2,3行的内容
-
删除指定的行
sed -i '2,d' txt # 删除文件的第2行 sed -i '1,2d' txt # 删除文件的1,2行 sed -i '$d' txt # 删除文件的最后一行
-
删除包含特定单词的行
sed -i '/DEBUG/d' pos.log # 删除日志中带有DEBUG的行
-
全局替换
- 将test_case.sql中的10.1.51.27 替换为 10.3.81.21
sed -i 's/10.1.51.27/10.3.81.21g' test_case.sql
- 键值对配置文件替换
sed -i "/^REM_DIR/cREM_DIR=`pwd`" tmux_start.sh
- 将test_case.sql中的10.1.51.27 替换为 10.3.81.21
-
在文本后面追加
sed -i '$ a hello world' txt # 将hello world 追加到txt文件后面
rev 命令
用于反转字符串
# echo "hello world" | rev
dlrow olleh
sort 命令
sort [-fbMnrtuk] file
-f 忽略大小写差异
-b 忽略前面空格部分
-u 去重(相同的数据只会出现一行)
-r 反向排序
-t 分隔符,默认用tab分隔
-k 以哪个区间来进行排序,配合上面-t使用
-n 按照数值大小排序
eg:
cat /etc/passwd | sort -t ':' -k 3
uniq 命令
uniq [-ic]
-i 忽略大小写字符的不同
-c 进行计数
wc 命令
wc [-lwm]
-l: 列出多少行
-w :仅列出多少字
-m :多少字符
xargs命令
xargs主要有2个用途:
- 很多命令不支持
|
管道来传递参数。
比如统计当前文件夹内的所有文件的行数,使用123
命令是错误的。 - xargs 是给命令传递参数的一个过滤器。
- 将多行文件变成单行文件
cat txt a b c d e f h i j cat txt | xargs a b c d e f h i j
- 查找所有的jpg文件,并压缩它们
find . -type f -name ".jpg" | xargs tar -czvf images.tar.gz
- 将多行文件变成单行文件
UUID
Linux 下使用命令生成UUID:
# uuidgen
53dbaf1c-1996-4dcc-8517-f17155d7c54a
或者使用:
# cat /proc/sys/kernel/random/uuid
前后台任务转换
将任务以后台的方式执行:
# nohup ./run.sh > test.log 2>&1 &
2>&1
&与1结合就代表标准输出了,意思是讲标准错误输出重定向到标准输出。
将后台任务切换到前台执行:
# jobs # 查看后台任务
# fg %1 # 将任务从后台转到前台
软件管理部分
yum命令
yum install xx # 安装
yum remove xx # 卸载
yum update xx # 升级
yum info xx # 查询
yum search xx # 搜索
yum --downloadonly --downloaddir=./rpms install ceph ceph-radosgw # 将ceph等rpm不安装下载到本地目录
python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)' # 查看yum需要的相关变量
rpm命令
-
列出所有已经安装的软件
rpm -qa
-
安装软件
rpm -ivh [软件包]
-
升级软件
rpm -Uvh [软件名]
-
卸载软件
rpm -e [软件包]
还可以使用
--nodeps
强制卸载 -
查看软件安装在了哪些地方
rpm -ql [软件名]
-
列出该软件所有设置文件
rpm -qc [软件名]
模拟回收站
mkdir -p ~/.Trash
cat >>~/.bashrc<<EOF
#add by caimengzhi at $(date +%F) for Linux trash start
alias rm=trash
alias rl='ls ~/.Trash'
alias ur=undelfile
alias ct=cleartrash
undelfile()
{
mv -i ~/.Trash/\$@ ./
}
trash()
{
mv \$@ ~/.Trash/
}
cleartrash()
{
read -p "Clear trash?[y/n]" confirm
[ \$confirm == 'y' ] || [ \$confirm == 'Y' ] && /bin/rm -rf ~/.Trash/*
}
#add by caimengzhi at $(date +%F) for Linux trash end
EOF
source ~/.bashrc
~/.Trash就是以后被删除的文件和文件夹移动到的地方,也就是回收站.
上面的操作本质上就是rm
命令的重命名。
使用语法:
- rm 删除
- ur 撤销
- rl 列出回收站
- ct 清空回收站命令
ping telent nc lsof pstack tcpdump curl 命令
gcc ar ldd ldconfig file size nm readelf objdump addr2line 命令
shell 编程
LVM 管理
perf 命令
strace 命令
gdb 命令
crontab 基础配置使用
tmux 命令
参考资料