linux基本命令集合

1 前言-参考资料#

正点原子:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html

2 linux 命令#

1.1 磁盘相关#

1.1.1 fdisk#

1.1.1.1 查看分区#

fdisk -l显示磁盘分区使用情况

image

1.1.1.2 删除分区#

fdisk /dev/sdb1 用来对sdb1进行分区.

image

输入m表示获取帮助,默认有分区sdb1, 然后输入d删除分区1,p打印出分区表,i表示打印出详细分区信息,n表示新增分区信息,w表示保存,q表示退出。

image

来看dev/sd*信息,发现已经没有了sdb1.

image

1.1.1.3 创建分区#

再来看如何建立分区1:
先建立一个1GB的分区,1GB= 1024 * 1024 * 1024=1073741824 B = 2097152个sector,一个sector有512 byte,再加上2048 个sector,那么等于2099200个sector。

image

再来何建立分区2:

image

这里First sector使用默认值2101248,Last sector使用4198400(1G是2097152, 2101248 + 2097152 = 4198400),分区2也是1GB
再来何建立分区3:

image

First sector和Last sector使用默认,那么最终分区3有26.8GiB。

最后输入w保存退出,来看下分区:

image

image

image

1.1.2 磁盘格式化命令-mkfs#

mkfs命令用来对磁盘分区格式化,将格式化好的sd卡放入windows系统查看,可以看到3个盘:

image

image

1.1.2.1 mount#

image

1.1.3 du#

image

1.1.4 df#

image

1.2 文件字符操作命令#

1.2.1 xargs#

find -name *.sh |xargs grep -rn "build_all"

image

1.2.1 find#

按时间搜索:
-atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)
-mtime 修改时间 (内容被修改)
-ctime 变化时间 (元数据或权限变化)

最近7天被访问过的所有文件:
find . -atime 7 -type f -print
最近7天被修改的文件:
find . -maxdepth 2 -mtime 7 -type f

通配符#

一版find命令还会伴随通配符使用:

1
2
3
4
*:匹配任意多个字符
?:匹配任意一个字符
[...]:匹配中括号内出现的任意一个字符
[!...]:不匹配中括号内出现的任意一个字符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ find . -name *.txt
$ find -name *.[ch]
$ find -name *fsi*.? #查找包含fsi字符,同时又有.c或者.h等单个字符后缀的文件
./i2c/busses/i2c-fsi.c
./spi/spi-fsi.c
./input/joystick/fsia6b.c
./fsi/fsi-sbefifo.c
./fsi/fsi-master-ast-cf.c
./fsi/fsi-master-aspeed.c
./fsi/fsi-master.h
./fsi/fsi-occ.c
./fsi/fsi-master-hub.c
./fsi/fsi-master-gpio.c
./fsi/fsi-core.c
./fsi/fsi-scom.c
./fsi/cf-fsi-fw.h

伴随执行任务#

1
2
# 找到后执行删除
find . -name "*.txt" -exec rm {} \;

1.2.2 grep#

find /path/to/directory -type f -name "*.txt" | grep "keyword"

-w 全词匹配。
-v 反向搜索
-i 不区分大小写

1
2
3
4
5
6
7
$匹配以字符串结尾的行
^ 匹配以字符串开头的行

找出空行 grep "^$" test.txt -n
找出unix开头的行grep "^unix" geekfile.txt
找出.结尾的行 grep "\.$" test.txt -n -o
找出os.结尾的行,grep "os.$" geekfile.txt

[abc]中括号

匹配abc字符中的任意一个:

image

匹配a-z:

image

下面一个脚本用grep -v排除掉不需要的行,也就是删除包含指定字符的行从一个文件。

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# 定义要删除的特定字符
pattern="特定字符"
# 定义要处理的文件名
filename="文件名"
# 使用grep命令找到含有特定字符的行,并将结果输出到一个临时文件中
grep -v "$pattern" "$filename" > temp.txt
# 将临时文件的内容复制回原始文件
cat temp.txt > "$filename"
# 删除临时文件
rm temp.txt

uniq 删除重复行#

tr字符串替换#

1.2 awk数据流处理#

常用的就是提取文件中的列字段,比如提取file中的第二个和第三个字段。
awk '{print $2, $3}' file

1.3 网络命令#

1
2
3
4
ifconfig eth0 up/down
udhcpc -i eth0 //通过路由器分配 IP 地址
ifconfig eth0 192.168.1.251 netmask 255.255.255.0 //设置 IP 地址和子网掩码
route add default gw 192.168.1.1 //添加默认网关

3 shell脚本命令#

3.1 解释器#

  1. sh解释器

  2. bash解释器
    脚本开头用#!用来申明用什么解释器,如:

    image

3.2 段代码注释#

1
2
3
<<EOF
...
EOF

image

3.3 read命令#

image

3.4 test命令#

测试文件,数值,权限,字符串等参数。

image

image

中括号也能表示测试,里面只能用==或!=。

image

3.4.1 文件测试#

image-20240921213503247

3.4.2 比较测试#

image-20240921213551593

3.4.3 多重条件测试#

image

image

可以看到第一和第三条test都成立:

image

3.5 命令行参数#

1
2
3
4
5
6
7
8
9
$0, $1, $2, $3...
$0表示脚本文件名
$1表示第一个参数
$n表示第n个参数
$#表示一共有多少个命令行参数
$@表示所有的命令行参数集合,$0 $1 $2 ... $n
$*表示等价$@
$?表示上一条命令是否返回成功,成功为0,错误非0
$$表示当前脚本的进程号

image

3.6 条件语句#

image

3.7 case语句#

image

3.8 函数#

image

image

image

3.9 循环语句#

image

image

image

3.9 数组#

用括号来表示数组,数组元素用“空格”符号分割开:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
array_name=(value0 value1 value2 value3)
array_name=(
value0
value1
value2
value3
)
#还可以每个元素进行定义,可以不使用连续的下标,而且下标的范围没有限制。
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

#读取数组
val=${array_name[2]}
all=${array_name[*]}
all2=${array_name[@]}

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

3.10 typeset或者declare#

sh脚本默认所有变量都是字符串,比如val=1,也表示val是一个字符串“1”。那么需要如何声明一个变量类型,用typeset或者declare。

1
typeset -i data=1

3.11 unset#

清除变量值.

3.12 readonly#

只读变量.

3.13 sed#

3.13.1 目录递归替换字符#

find /path/to/dir -type f -name "*.[c-h]" -exec sed -i 's/oldstring/newstring/g' {} +

1
2
3
4
5
6
7
8
find /path/to/dir:找到指定目录/path/to/dir下的所有文件。
-type f:仅查找文件。
-name "*.txt":限制文件名以.txt结尾。
-exec:对找到的每个文件执行后面的命令。
sed -i:使用sed进行替换,-i表示直接修改文件内容。
's/oldstring/newstring/g':sed的替换表达式,g表示全局替换。
{}:表示find找到的文件名。
+:结束-exec命令,批量处理匹配到的文件。

3.13.2 去掉一行中多余的空格#

sed -i 's/[[:space:]]\+/ /g' array.sh
s/[[:space:]]\+/ /g 是替换命令,它会将一个或多个空白字符(包括空格、制表符等)替换为单个空格.

3.14 shell脚本如何查看将要执行的命令#

1
2
3
#!/bin/sh
set -x
echo "Hello, World!"

3.15 字符串中替换一个字符#

1
2
3
string="123123"
echo ${string/3/0} #用0替换第一个遇见的3
echo ${string//3/0} #用0替换串中所有3

3.16 算数运算符#

image

3.17 重定向#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$who
weiyong.luo pts/1130 2024-09-21 12:12 (xxx.xxx.xxx.xxx)
shawn.wu pts/1036 2024-09-11 17:48 (xxx.xxx.xxx.xxx)
weiyong.luo pts/1133 2024-09-21 12:12
robin.lee pts/1134 2024-09-21 15:23
chengzhi.lian pts/1135 2024-09-21 09:02
robin.lee pts/1166 2024-09-20 18:15

who >users ##输出重定向到users文件

#再看输入重定向
#从文件获取输入信息给命令。
$ wc -l < users #统计users文件的行数
12

3.17.1 保存log到文本#

make all > build_osdrv.log 2>&1