常用Linux命令

*爱你&永不变心* 提交于 2020-03-15 20:39:52
常用Linux命令

1 文件管理

1.1 列出文件

ls [OPTIONS]... [FILE]...
参数 说明
-a 列出全部文件。
-l 使用长格式打印。
-h 使用易读格式打印。
-t 按修改时间排序。
-n 以数字形式打印用户和组ID。
-s 显示文件使用的块(512字节)数量。
-u 按访问时间排序。
-c 按文件状态修改时间排序。

1.2 打印当前工作目录

pwd

1.3 建立目录

mkdir [OPTIONS]... [DIRECTORY]...
参数 说明
-m 设定模式。
-p 自动建立上层目录。

1.4 切换工作目录

cd DIRECTORY

1.5 删除文件或目录

rm [OPTIONS]... [FILE]...
参数 说明
-f 强制删除。
-i 删除前要求用户确认。
-r 递归删除目录下的文件和子目录。
-d 删除空目录。
rmdir [FILE]...

rmdir 等价于 rm -d .

1.6 移动文件或目录

mv [OPTIONS]... SOURCE TARGET
参数 说明
-f 强制移动。
-b 覆盖前备份。
-i 覆盖前询问。
-n 不会覆盖已有文件。
-u 只覆盖旧文件。

1.7 复制文件或目录

cp [OPTIONS]... SOURCE TARGET
参数 说明
-b 建立备份。
-f 强制复制。
-i 复制前询问。
-r 递归复制。

1.8 统计文件或目录大小

du -sh

2 文件操作

2.1 查看文件

查看文件头部若干行或若干字节

head [-n COUNT | -c BYTES] [FILE]...

查看文件尾部若干行或若干字节

tail [-n count] [-f] [-pid=PID]

查看文件

more [OPTIONS] [FILE]...
参数 说明
+n 从第n行开始。
-n 屏幕显示n行。
-c 显示前清空屏幕。
-p 按页显示。

less和more的用法一样。区别是more仅仅支持向前滚动,less支持向后滚动。

less [OPTIONS] [FILE]...

2.2 连接文件

cat [OPTION]... [FILE]...

连接文件并输出到标准输出。

参数 说明
-n 显示行号。
-s 将连续空行合并为一个空行。
-v 显示非打印字符。

2.3 反向连接文件

反向连接文件并输出到标准输出。

tac

2.4 按列提取文件内容

cut -c3-5 a.txt # 提取a.txt的3-5列。

2.5 比较文件差异

diff [OPTION]... [FILE]...

2.6 打包文件

tar

2.7 压缩文件

gzip

2.8 统计文件行数

wc [-clmw] [FILE]...
参数 说明
-c 统计字节数。
-l 统计行数。
-m 统计字符数。
-w 统计字数。

2.9 打印文件并增加行号

nl a.txt

2.10 更新文件时间戳

touch [OPTIONS]... FILE...
参数 说明
-a 更改访问时间。
-c 如果文件不存在,不要建立文件。
-d 设定为指定日期。
-m 更改文件修改时间。
-t 设定为指定时间。

3 日期和时间

3.1 打印日期

date [+FMT]
FMT 说明
%H 小时(24小时制)。
%M 分钟。
%S 秒。
%d 日期(01-31)。
%m 月(01-12)。
%Y 年(4位)。
%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)

% : 印出冒号
% %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 : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 %S : 秒(00..61) 
%T : 直接显示时间 (24 小时制) 
%X : 相当于 %H:%M:%S 
%Z : 显示时区 
date --date='1 day ago' +%Y-%m-%d   # 去年的今天
date --date='1 month ago' '+%Y-%m'  # 上个月
date --date="$(date +%e) days ago" '+%Y-%m-%d' # 上个月最后一天

3.2 打印日历

cal [-1 | -3 | -y] [-m|-s]
参数 说明
-1 显示当月日历。
-3 显示上月、当月、下月日历。
-y 显示全年日历。
-m 星期一作为星期第一天。
-s 星期日作为星期第一天。

4 搜索

4.1 搜索程序

which

4.2 搜索程序名

whereis 
参数 说明
-b 搜索可执行文件。
-m 搜索man文件。
-s 搜索源代码文件。

4.3 搜索文件

find
参数 说明
-print 打印将匹配的文件名。
-exec 对匹配的文件执行指定命令。
-name 按名字查找。
-perm 按权限查找。
-user 按属主查找。
-type 按类型查找。
-depth 设定最大查找深度。

4.4 正则表达式搜索

grep

5 进程管理

5.1 查看进程

ps
参数 说明
a 显示所有进程。
c 显示进程真实名称。
-A 显示所有进程。
-e 显示所有进程。
f 显示进程间关系。
-H 以树状结构显示。
u 显示指定用户的所有进程。

5.2 向进程发送信号

kill -s SIGNAL PID

5.3 列出信号

kill -l

5.4 查看进程打开的文件

lsof

5.5 实时查看系统进程

top

6 网络

6.1 检查网络联通性

ping

6.2 查看本地套接字

netstat
ss

6.3 查看网卡配置

ifconfig

6.4 查看主机名

hostname

6.5 跟踪IP路由

traceroute

6.6 查看本地路由表

route

6.7 下载文件

wget

6.8 抓取网络包

tcpdump -n -nn dst port 9001 -i eth1

7 辅助函数

7.1 打印字符串

echo Hello

8 Bash

8.1 变量

#变量和运算

定义变量

message="hello"

使用变量

echo $message
echo ${message}

只读变量

name="John"
readonly name
name="Alice"
# -bash: name: readonly variable

删除变量

message="John"
echo message
unset message

定义全局变量

message="hello"
export message
export message="world"

全局变量

echo $HOME
echo $PATH
echo $SHELL
echo $UID
echo $GID
echo $HOSTNAME
x=1
echo $x
unset x
a=(1 2 3)
unset a[0]
let x=1
let _y=x+1
# 判断对象是否被设置
if [ -z ${var+x} ]; then echo "var is unset"; fi # whatever x is

8.2 分支条件

if [ "$foo" = "x86_64 ]; then
  echo "OK"
else
  echo "FOO"
fi

((a=1))
if ((a)); then
  echo "1"
fi
if [ "foo" == "$1" ]; then
    echo "a"
else
    echo "b"
fi

常用条件

[ -a FILE ] # 是否文件存在
[ -b FILE ] # 是否block文件
[ -c FILE ] # 是否字符文件
[ -d FILE ] # 是否目录存在
[ -e FILE ] # 是否文件存在
[ -f FILE ] # 是否普通文件
[ -h FILE ] # 是否符号链接
[ -p FILE ] # 是否管道
[ -r FILE ] # 是否可读
[ -s FILE ] # 是否非空文件
[ -w FILE ] # 是否可写
[ -x FILE ] # 是否可执行
[ FILE1 -nt FILE2 ] # 是否FILE1比FILE2新
[ FILE1 -nt FILE2 ] # 是否FILE1比FILE2旧
[ -z STRING ] # 是否空字符串
[ -n STIRNG ] # 是否非空字符串
[ STRING ] # 是否非空字符串
[ STRING1 == STRING2 ] # 是否STRING1等于STRING2 
[ STRING1 != STRING2 ] # 是否STRING1不等于STRING2
[ STRING1 < STRING2 ] # 是否STRING1小于STRING2
[ STRING1 > STRING2 ] # 是否STRING1大于STRING2
[ ARG1 OP ARG2 ] # 关系判断。OP是-eq, -ne, -lt, -le, -gt, -ge之一。
# 复合条件
[ !EXPR ]
[ (EXPR) ]
[ EXPR1 -a EXPR2 ] # and
[ EXPR1 -o EXPR2 ] # or

字符串比较

-eq 等于
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
-z 空字符串
= 相等
!= 不相等
-n 非空字符串

文件比价

-nt 文件1比文件2新
-ot 文件1比文件2旧
-ef 文件1是文件2的硬链接

多个条件

if 条件; then
    语句
elif 条件; then
    语句
else
    语句
fi

使用test判断条件

test 3 -gt 4 && echo True || echo False
test "abc" = "def"; ehco $?
[ "abc" < "def" ]; echo ?
case "$1" in

1) echo "a";;
2) echo "b";;
*) echo "c";;

esac
echo -n "Do you agree with this? [yes or no]: "
read yno
case $yno in

[yY] | [yY][Ee][Ss] )
    echo "agreed"
    ;;
[nN] | [n|N][O|o] )
    ehco "not agreed"
    ;;
esac

8.3 数值计算

((a=1))
((b=2))
((c=a*b))
echo $c

8.4 执行命令

arch=`uname -a`
echo $arch

8.5 数组

a=(1 2 3)
echo ${a[0]}
# 数组长度
${#a[@]}
${#a[*]}
b[0]=1
b[1]=2

8.6 函数

function f1 {
  echo $1
}


   function fct() {
       local result=$1
       local myresult='some'
       eval $result="'$myresult'"
   }

   fct foo
   echo $foo

   # $* 参数列表
   # $# 参数列表长度

函数返回值

# 返回
exit -1
# 读取上一个命令的返回值
echo $?
$# 参数个数
$* 参数列表
$$ 当前进程ID
$! 后台运行的最后一个进程ID
$@ 和$*相同
$- shell当前选项
$? 命令最后的退出状态

8.7 字符串

# 子字符串
${variable:start:len}
# 删除首个以tail结尾的子串
${variable#*tail}
# 删除以tail结尾的子串中,最长的那个
${variable##*tail}
# 删除以head开头的最后一个子串
${variable%head*}
# 删除已head开头的子串中,最长的那个
${variable%%head*}
# 长度
${#str}

计算字符串长度

message="hello"
expr length $message
echo ${#message}

查找字符串

expr index $message "ll"

取子字符串

expr substr "$message" 1 2 # he
echo ${message:2}          # llo
echo ${message:2:3}        # llo
echo ${message:(-1):5}     # o

字符串替换

pets="cat,dog,cat"
echo ${pets/cat/CAT}   # 替换首个
echo ${pets//cat/CAT}  # 替换全部
echo ${pets/#cat/CAT}  # 按前缀匹配替换
echo ${pets/%cat/CAT}  # 按后缀匹配替换

字符串比较

[[ "a.txt" == a* ]]
[[ "a.txt" =~ .*\.txt ]]
[[ "abc" == "abc" ]]
[[ "11" < "2" ]]

字符串连接

name="John"
message="Hello, "
echo $message$name
echo "Bye, ${name}"

8.8 循环

while循环

while condition; do
    statement
done

until循环

until condition; do
    statement
done

for循环

for i in 'apple' 'orange' 'banana'; do
    echo $i
done

循环示例:

for i in {1..10}; do
    echo $i
done

循环示例:

for i in `ls`; do
    echo $i
done

循环示例:

for i in {a..z}; do
    echo $i
done
for i in `seq 1 2 10`; do
    echo $i
done
for ((i=1;i<=100;i++))
do
    echo $i
done
while [ $count -lt 10 ]; do
  # ...
done
for i in $(ls); do
    echo $i
done

for i in `seq 1 10`; do
    echo $i
done

COUNTER=0
while [ $COUNTER -lt 10 ]; do
    echo $COUNTER
    let COUNTER=COUNTER+1
done

COUNTER=20
util [ $COUNTER -lt 10 ]; do
    echo $COUNTER
    let COUNTER-=1
done

$lst="1 2 3"
for i in $lst; do echo $i; done

变量中字符的删除与替换

变量设置方式    说明 ${变量#关键字}  ${变量##关键字}    若变量内容从头开始的数据符合“关键字”,则将符合的最短数据删除。  若变量内容从头开始的数据符合“关键字”,则将符合的最长数据删除。 ${变量%关键字}  ${变量%%关键字}    若变量内容从尾向前的数据符合“关键字”,则将符合的最短数据删除。  若变量内容从尾向前的数据符合“关键字”,则将符合的最长数据删除。 ${变量/旧字符串/新字符串}  ${变量//旧字符串/新字符串}    若变量内容符合“旧字符串”,则第一个旧字符串会被新字符串替换。  若变量内容符合“旧字符串”,则全部的旧字符串会被新字符串替换。 除了上述变量设置方式,还有如下用法:

${var:0:5}截取var变量的前5个字符 ${#var}获取var变量的长度 代码实例参考 鸟哥第十章变量内容的删除与取代 。

变量的测试与替换

var=${str:=expr} 如果str为null或空字符串,则var的值为expr,并且expr赋值给str;如果str非空则var的值为$str

var=${str:?expr} 如果str为null或空字符串,则var的值为null,并且expr输出至stderr;如果str非空则var的值为$str

var=${str:-expr} 与第一个“=”的类似,只是expr不赋值给str

var=${str:+expr} 与上面“-”的相反

8.9 输入输出

OPTIONS="Hello Quit"
select opt in $OPTIONS; do
    if [ "$opt" = "Quit" ]; then
      echo done
      exit
    elif [ "$opt" = "Hello" ]; then
      echo Hello World
    else
      clear
      echo bad option
    fi
done

read name email
echo $name $email

#输入和输出

打印字符串

echo hello

将命令输出保存到文件

ls > result.txt

从文件输入

command < input.txt

输入

read input
echo $input

9 附录:常用命令

9.1 查看系统block size大小的方法

  1. 用tune2fs查看block size大小:
$ tune2fs -l /dev/sda1 |grep "Block size"
Block size:               1024
  1. 用stat查看block size大小:
stat /boot/|grep "IO Block"
Size: 1024          Blocks: 2          IO Block: 1024   目录
  1. 用dumpe2fs查看block size大小:
dumpe2fs /dev/sda1 |grep "Block size"
Block size:               1024

9.2 CentOS下安装桌面系统的方法

yum groupinstall "X Window System"
yum grouplist
startx

9.3 查看网卡

ip addr show

9.4 关闭防火墙

service firewalld stop

9.5 获取脚本执行路径

export DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

9.6 判断文件中是否存在某个字符串

if grep -q root /etc/passwd; then
    echo account root exist
else
    echo account root not exist
fi

9.7 判断文件是否相同

if ! diff -q file1 file2; then
    echo diff
else
    echo same
fi

9.8 查找大文件

find . -type f -size +100M -exec ls -lh {} \;

9.9 查找大目录

for x in `du --max-depth=3 | sort -nr | head -10 | awk '{print $2}'`; do du -sh $x; done;
# 
du --max-depth=3 | sort -nr | head -10

9.10 查看磁盘空间

df -h

10 附录:常见问题

10.1 最小化安装后无法使用yum

最小化安装后,需要手动设置网卡才能联网。进入目录

etc/sysconfig/network-script

找到名字为

ifcfg-xxx.sh

的文件,将其中各项配置修改为

NM_CONTROLLED="no"  ONBOOT="yes"  BOOTPROTO="dhcp" 

然后重启network服务

service network restart
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!