Linux 期末速成(知识点+例题)

代码学习

(1)查看运行结果,思考为什么?

    [root@ red ~]#VAR1=1
​    [root@ red ~]#(VAR1=2; echo $VAR1)
​    [root@ red ~]#echo $VAR1
​    [root@ red ~]# { VAR1=2; echo $VAR1; }
​    [root@ red ~]# echo $VAR1
  1. VAR1=1:设置变量 VAR1 的值为 1。
  2. (VAR1=2; echo $VAR1):这是一个子 shell 环境,VAR1=2 在子 shell 中设置变量 VAR1 的值为 2,然后 echo $VAR1 打印出子 shell 中的 VAR1 值,即 2。但是,这个子 shell 中的变量改变不会影响父 shell 中的 VAR1 值。
  3. echo $VAR1:打印出父 shell 中的 VAR1 值,由于上一条命令是在子 shell 中执行的,所以这里的输出仍然是 1。
  4. { VAR1=2; echo $VAR1; }:这是一个组命令(group commands),与子 shell 类似,它在当前 shell 的环境中执行,但变量的改变不会影响外部环境。因此,VAR1=2 设置的变量只在组命令内部有效,echo $VAR1 打印出的是 2,但这个改变不会反映到组命令外部。
  5. echo $VAR1:再次打印父 shell 中的 VAR1 值。由于第 4 点中的改变只限于组命令内部,所以这里的输出依然是 1。

(2)p1.sh文件的内容如下,运行并查看结果。

array=(Mon Tue Wed Thu Fri Sat Sun)
len="${#array[@]}"
for ((i=0;i<len;i++)); do
echo ${array[i]} # 打印元素
done
# 过程:
[root@red ~]# vi p1.sh
[root@red ~]# chmod u+x p1.sh
[root@red ~]# ./p1.sh

chmod

chmod 权限模式(符号模式 / 数字模式) 文件名

符号模式是通过符号来表示权限的方式(读取(r),写入(w)和执行(x)),包括:

  • u:代表所有者的权限
  • g:代表所属组的权限
  • o:代表其他人的权限
  • a:代表所有人的权限(即u、g和o的权限)
  • +:增加权限
  • -:减少权限
  • =:设置权限

要将file.txt文件的所有者权限设置为读写执行,可以使用以下命令:chmod u=rwx file

数字模式是通过数字来表示权限的方式,每种权限对应一个数字(所有者+所属组+其他人,比如下面的7=1+2+4),而且三个数的顺序刚好是所有者+所属组+其他人,所以所属组和其他人的权限是 0 :

  • 读取权限:4
  • 写入权限:2
  • 执行权限:1

将file.txt文件的所有者权限设置为读写执行,可以使用以下命令:chmod 700 file.txt

shell 语法

  1. 注释:

    • 以 # 开头的行是注释,不会被执行。
  2. 变量:

    • 变量使用 VAR=value 格式定义。
    • 使用 $VAR 来引用变量的值。
    • 变量名通常大写以区分普通字符串。
  3. 引号:

    • 单引号 ' ' 用于保持字符串的字面意义,不会展开变量。
    • 双引号 " " 允许变量展开,同时可以包含空格。
  4. 字符串:

    • 字符串是字符序列,可以用单引号或双引号括起来。
  5. 算术运算:

    • 使用 $(( )) 进行算术运算,例如:$(( 1 + 1 ))。
  6. 条件语句:

    • 使用 if、then、else、elif(else if 的缩写)、fi 构建条件语句。
  7. 循环:

    • for 循环用于遍历列表。
    • while 循环在条件为真时不断执行。
    • until 循环在条件为假时不断执行。
  8. 数组:

    • 定义数组:array=(value1 value2 ...)
    • 引用数组元素:${array[index]}
    • 获取数组长度:${#array[@]} 或 ${#array[*]}
  9. 函数:

    • 使用 function_name() { ... } 定义函数。
    • 使用函数名调用函数。
  10. 输入和输出:

    • 使用 < 重定向输入。
    • 使用 > 重定向输出,覆盖文件。
    • 使用 >> 重定向输出,追加到文件。
  11. 管道:

    • 使用 | 将一个命令的输出作为另一个命令的输入。
  12. 通配符:

    • * 匹配任意数量的字符。
    • ? 匹配单个字符。
  13. 文件测试:

    • 使用 [[ ]] 进行文件测试,例如 [[ -f filename ]] 检查文件是否存在。
  14. 命令替换:

    • 使用 $(command) 或反引号 `command` 来执行命令并使用其输出。
  15. 子 shell:

    • 使用圆括号 (command) 创建子 shell 执行命令。
  16. 命令行参数:

    • $0 是脚本名称。
    • $1、$2 等是脚本的参数。
    • $# 是参数的数量。
    • $* 和 $@ 是所有参数的列表。
  17. 环境变量:

    • 环境变量通常大写,如 PATH。
  18. 退出状态:

    • 使用 exit 或 return 命令退出脚本,并可以返回一个状态码。
  19. 信号:

    • 使用 trap 命令捕获信号。
  20. Shell 脚本的执行:

    • 直接调用脚本:./scriptname.sh
    • 使用 source 或 . 命令在当前 shell 环境中执行脚本。

(3)p2.sh文件的内容如下,运行并查看结果。

array=(Mon Tue Wed Thu Fri Sat Sun)
for e in "${array[@]}" ; do # 将数组展开echo $e
done
for e in "${array[*]}" ; do # 将数组当成一个整体 但是包含空格 会被分割为多个元素echo $e
done # 最终打印为循环遍历两次数组

(7)编辑p4.sh 其内容如下。

echo  $# $1 $2 $3 $4 # $# 参数个数
shift
echo  $# $1 $2 $3 $4
shift
echo  $# $1 $2 $3 $4
set  aa bb  cc # 重新设置值
echo  $# $1 $2 $3 $4             
#   运行查看结果。
[root@red ~]# bash p4.sh 10 20 30 40 50
5 10 20 30 40
4 20 30 40 50
3 30 40 50
3 aa bb cc

(9)依次运行下述命令,查看结果(==与=~两边有空格)

[root@red ~]# str="axxyycd"
[root@red ~]# [[ $str == a?b ]]; echo $? # a?b 表示以 'a' 开头,后面跟着 0 或 1 个任意字符,然后是 'b' 命令条件为false, echo $? 将打印上一个命令的退出状态码,即 1
[root@red ~]# [[ $str == a*b ]]; echo $? # 表示以 'a' 开头,后面跟着任意数量(包括 0)的任意字符,然后是 'b' 条件为 true 打印 0
[root@red ~]# str="abcabcabcabcd"
[root@red ~]# [[ $str =~ a ]];echo $? #  str 中包含字符 'a',条件为真,打印 0
[root@red ~]# [[ $str =~ abc ]];echo $? # 包含子字符串 "abc",所以 [[ $str =~ abc ]] 将返回 0
[root@red ~]# [[ $str =~ (abc)+ ]]; echo $? # (abc)+ 表示 "abc" 这个模式出现一次或多次
[root@red ~]# [[ $str =~ ^(abc)+$ ]]; echo $? # ^ 和 $ 分别表示字符串的开始和结束,整个表达式表示整个字符串是否只由 "abc" 重复组成 不满足 打印1 
[root@red ~]# [[ $str =~ ^(abc)+d$ ]]; echo $? # 是否以 "abc" 重复开始并以 "d" 结束 打印 0

== 和 =(不严格) 都可以判断是否相等

=~ 左侧的字符串能否匹配右侧的正则

(10)文件 p5.sh 内容如下,运行并查看结果

  rm –r da # 尝试递归删除目录 da 及其内容touch b.txtif [ -f b.txt ] && echo "file" && [ -d da ] && echo " directory"  # filethenecho "one" elseecho "two" # two fi

(11)文件p6.sh 内容如下,运行bash p6.sh /root并查看结果

dir=$1
if [ -d $dir ]; then # 检查变量 dir 是否指向一个存在的目录cd $dirfor fname in * ; do # 对当前目录中的每个文件和目录条目进行遍历  do 表示循环体开始if [ -f $fname ]; then # 检查当前条目 fname 是否是一个文件 then 表示执行下列语句块echo $fnameelseecho "$fname  invalid file"fi # 结束 if-else 循环done # 结束 for  循环
elseecho "bad directory name:$dir"
fi

编程题

(1)设计一个shell脚本,求最小值

min=10000
for i in 12 5 18 58 -3 80 ;doif (( i<min )) ;then(( min=i ))fi
done
echo " The smallest number is: $min"

(2)设计一个shell脚本,求命令行上所有参数整数和。

sum=0
while (( $# != 0 )) ; do # $# 表示传递给脚本的参数个数(( sum = sum+$1 )) # 传递给脚本或命令的第一个参数shift # 改变位置参数的值,使得当前的 $1 变成 $2 同理
done
echo "the sum of arguments is $sum"

(3)读取正整数m,计算各位和,例如123,各位和1+2+3=6

read m
while (( m!=0 )) ;do(( sum=sum+m%10 ))(( m=m/10 ))
done
echo $sum

(4)判断回文数(思考回文串)

reverse(){x=`echo -n $1| rev` # -n 表示不换行 rev 表示翻转字符串if [[ $x==$1 ]];thenreturn 0; # 条件为真(即 $x 等于 $1),则返回状态码 0 成功或真值elsereturn 1fi
}

双方括号 [[ ... ]]:

  • 用于条件表达式测试。
    - 支持模式匹配和正则表达式。
    - 可以使用 && 和 || 来组合多个测试条件。
    - 某些情况下,可以不用反引号(backticks)或 $(...) 来执行命令。
    - 可以包含空格,因此在处理包含空格的字符串时更加方便。

小括号 ((...)):

  • 主要用于算术运算和表达式求值。
  • 强制Shell执行算术优先级,即使在表达式中有其他运算符。
  • 可以用来计算表达式的结果,并将结果赋值给变量。
  • 不能用来测试文件存在性或字符串匹配等条件测试。

(6)从100开始找到50个含有7的素数输出,每五个一行。

function isprime(){n=$1if((n==2));thenreturn 0;filocal i; # 定义一个遍历for ((i=2;i<=n/2;i++)); doif (( n%i == 0 )); thenreturn 1;fidonereturn 0;
}
i=100
count=0
while  ((count<=50)); doisprime $i r=$?if (( r==0 )) && [[ "$i" =~ 7 ]] ;thenprintf  "%4d"  $i((count++))if (( count%5 ==0 ));thenecho ""fifi
((i++))
done

(2)编写shell程序,输出下列图形,行数由键盘输入:

							11	21	2	31	2	3	41	2	3	4	5 

要编写一个shell程序输出指定行数的图形,可以使用嵌套循环来完成。

#!/bin/bash
# 读取用户输入的行数
read -p "请输入行数: " rows
# 循环打印每一行
for (( i=1; i<=rows; i++ ))
do# 打印前导空格,使数字右对齐for (( j=rows; j>i; j-- ))doecho -ne "\t"done# 打印数字for (( k=1; k<=i; k++ ))doecho -ne "$k\t"done# 换行echo
done
  1. read -p "请输入行数: " rows:提示用户输入行数并将其存储在变量 rows 中。
  2. 外层 for 循环 for (( i=1; i<=rows; i++ )):控制打印的行数。
  3. 内层 for 循环 for (( j=rows; j>i; j-- )):打印前导空格,使数字右对齐。
  4. 第二个内层 for 循环 for (( k=1; k<=i; k++ )):打印每行的数字。
  5. echo:在每一行的最后换行。

find

find /path/to/search -name 'filename.txt'
find /path/to/search -regex '.*\.txt'
find /path/to/search -type f # f 仅搜索文件 d 仅搜索目录
find /path/to/search -empty # 空文件
find /path/to/search -size +10M # 按文件大小搜索
find /path/to/search -mtime -7 # 搜索过去 7天内被修改的文件
find /path/to/search -name '*.txt' -exec rm {} \; # {} 占位 exec 表示执行命令

grep

grep [-xxx] 'pattern' file.txt # 搜索字符串 pattern 并打印所有匹配的行
grep -r 'pattern' /path/to/directory # 递归搜索指定目录

-xxx 选项:

  • -i 不区分大小写
  • -v 排除匹配的行
  • -c: 对匹配的行计数
  • -n 输出中包括匹配行的行号
  • -l 仅打印包含匹配行的文件名
  • -h: 抑制包含匹配模式的文件名的显示

cut

cut -d',' -f1,3 filename.csv # filename.csv 中提取第一和第三列,逗号作为分隔符
cut -d' ' -f1 --complement filename.txt # 提取除了第一列以外的所有列
cut -d' ' -f2-4 filename.txt  # 第二到第四列
cut -d' ' -f1 filename.txt | grep -v '^$' # 排除空白行

sort

sort [-xxx] filename.txt # 对文件中的行进行默认的升序排列

-xxx选项:

  • -n: 数值升序排列
  • -r:降序
  • -kn:对第 n 列进行排序
  • -b:忽略行开头空白字符
  • -u:去除重复行
  • -t: :指定 : 作为分隔符

uniq

通常与 sort 命令结合使用,因为 uniq 只能识别连续的重复行。

sort input.txt | uniq # 过滤掉排序后的连续重复行
sort input.txt | uniq -c # 计算重复行

选项:

  • -d: 只打印重复行
  • -u:打印不重复的行
  • -s:忽略前导空白
  • -w 5:设置字段宽度为 5
  • -f 2:跳过前两个字段

awk

awk '/pattern/ { print $0 }' input.txt # 打印包含 pattern 的行
awk '{ print $1, $3 }' input.txt # 打印每行的第一个第三个字段
awk '{ num += $1 } END { print num / NR }' input.txt # 计算第一列的平均值

sed

    • (1) 查找包含字符 “o” 的行(“o” 可以出现任意次数):
      sed -n '/o/ p' /etc/passwd
      
    • (2) 查找包含一个或多个字符 “o” 的行:
      sed -n '/o.*o/p' /etc/passwd
      
    • (3) 查找包含两个或多个字符 “o” 的行:
      sed -n '/oo.*/p' /etc/passwd
      
  1. 使用 sed 将 input 文件中的 \OU 字符串修改为 (ou):

    sed 's/\OU/(ou)/g' input > output
    
  2. 使用 sed 打印 input 文件中除第3到8行之外的所有行:

    • 使用 -n 和 p 打印指定行:
      sed -n -e '1,2p' -e '9,$p' input
      
    • 使用 skip 到第8行后开始打印:
      sed -n '1,8!p' input
      
    • 使用 sed 的模式空间:
      sed -n '1p;2p;8q;9,$p' input
      
  3. 使用 sed 将 input 文件中的 “abcde” 替换为 “EDCBA”:

    sed 's/abcde/EDCBA/g' input > output
    
  4. 写一个命令,去掉某文件中所有的空格符,并将结果存储到 a.txt:

    tr -s ' ' < original_file > a.txt
    
  5. 使用 awk 处理 student 文件:

    • (1) 列出姓名,平均分,总分(假设第一列是姓名,第二列是科目数,第三列是每科成绩):
      awk '{sum+=$3; avg=sum/$2;} END {print "Name:", $1, "Average:", avg, "Total:", sum}' student
      
    • (2) 列出有不及格的学生姓名(假设60分为及格):
      awk '$3 < 60 {print $1}' student
      
    • (3) 列出总分第一名的学生姓名(考虑并列第一的情况):
      awk '{sum[$1]+=$3;} END {max=0; for (name in sum) if (sum[name] > max) {max=sum[name]; names=name} else if (sum[name] == max) {names=names " " name}; print "Top scorer(s):", names}' student
      

创建删除和修改

创建新用户

  1. sudo useradd newusername
    

    这将创建一个名为 newusername 的新用户。

  2. 修改用户信息:

    • 使用 usermod 命令可以修改用户的账户信息,例如用户的组、登录shell等。
      sudo usermod --shell /bin/bash username
      
    • 更改用户密码:
      sudo passwd username
      
  3. 删除用户:

    sudo userdel username
    

    这将删除用户 username,但保留用户的家目录和文件。

  4. 删除用户及其家目录:

    sudo userdel --remove-home username
    

    使用 --remove-home 选项可以同时删除用户及其家目录。

文件和目录管理

  1. 创建文件或者目录:

    touch filename.txt
    

    使用 touch 命令创建一个空文件。

  2. 创建目录:

    mkdir directoryname
    

    使用 mkdir 命令创建一个新目录。

  3. 修改文件或目录权限:

    chmod 755 filename.txt
    

    使用 chmod 命令更改文件或目录的权限。

  4. 修改文件或目录所有者:

    chown newowner filename.txt
    

    使用 chown 命令更改文件或目录的所有者。

  5. 删除文件:

    rm filename.txt
    

    使用 rm 命令删除文件。

  6. 删除目录:

    rmdir directoryname
    

    使用 rmdir 命令删除空目录。如果目录非空,可以使用 rm -r directoryname 来递归删除目录及其内容。

  7. 移动或重命名文件/目录:

    mv oldname.txt newname.txt
    

    使用 mv 命令移动或重命名文件和目录。

  8. 复制文件/目录:

    cp source.txt destination.txt
    cp -r source_directory destination_directory
    

    使用 cp 命令复制文件,使用 -r 选项递归复制目录。

  9. 查看文件内容:

    cat filename.txt
    

    使用 cat 命令查看文件内容。

  10. 查看文件状态:

      ls -l filename.txt
    

    使用 ls -l 命令查看文件的详细状态,包括权限、所有者、大小和最后修改时间。

mount

mount /dev/sda1 /mnt/mydrive # 将挂载设备 /dev/sda1 到 /mnt/mydrive 目录
mount -o ro /dev/sda1 /mnt/mydrive # 以只读的方式挂载
df -h # 查看挂载的文件系统 df 命令显示磁盘空间使用情况,-h 选项以人类可读的格式(如 GB、MB)显示
umount -f /mnt/mydrive # 强制卸载

正则

  1. 普通字符:
    • 普通字符是正则表达式中最常见的,它们表示搜索匹配自己的字面值。例如,正则表达式 hello 匹配包含 “hello” 字符串的文本。
  2. 字符类:
    • 使用方括号 [...] 定义字符类,匹配方括号内的任何单个字符。例如,[abc] 匹配 “a”、“b” 或 “c”。
  3. 范围表达式:
    • 在字符类中,可以使用连字符 - 表示范围。例如,[a-z] 匹配任何小写字母。
  4. 否定字符类:
    • 使用脱字符 ^ 放在方括号内来否定字符类。例如,[^abc] 匹配除了 “a”、“b”、“c” 之外的任何单个字符。
  5. 重复操作符:
    • * 表示前面的元素零次或多次出现。
    • + 表示一次或多次出现。
    • ? 表示零次或一次出现。
    • {n} 表示恰好 n 次出现。
    • {n,} 表示至少 n 次出现。
    • {n,m} 表示 n 到 m 次出现。
    • . 表示任意单个字符。
  6. 分组:
    • 使用圆括号 (...) 来创建一个分组,允许对正则表达式的部分进行组合,并可以与捕获组一起使用。
  7. 选择:
    • 使用竖线 | 表示选择。例如,cat|dog 匹配 “cat” 或 “dog”。
  8. 锚点:
    • ^ 表示行的开始。
    • $ 表示行的结束。
    • \b 表示单词边界。
  9. 转义特殊字符:
    • 使用反斜杠 \ 来转义特殊字符,使其失去特殊含义,表示字面值。例如,要匹配点号 .,可以使用 \.。
    • \d: 匹配从 0 到 9
    • \D: 表示 [^0-9]
    • \s: 它用于匹配文本中的空白区域
    • \w: 所有字母、数字以及下划线
    • \b: 确定单词的起始和结束位置

在正则表达式中,\w、\s 和 \b 是具有特殊含义的转义序列,分别用于匹配不同的字符集合:

  1. \w:

    • \w 匹配任何单个字字符,等同于 [a-zA-Z0-9_]。这包括所有字母、数字以及下划线。它不匹配非拉丁字符,如汉字或西里尔字母。
  2. \s:

    • \s 匹配任何空白字符,包括空格、制表符(\t)、换行符(\n)、回车符(\r)、垂直制表符(\v)和换页符(\f)。它用于匹配文本中的空白区域。
  3. \b:

    • \b 匹配一个单词边界。单词边界通常是指一个单词字符(\w)和非单词字符(\W 或任何非 \w 的字符)之间的位置。特殊地,字符串的开头和结尾也被视为单词边界。\b 常用于确定单词的起始和结束位置,以便进行诸如单词匹配的操作。

示例:

  • 匹配一个单词(假设单词由字母、数字或下划线组成):

    \b\w+\b
    
  • 匹配一个或多个空格:

    \s+
    
  • 匹配一个句子,假设句子以点号结束,并且句子中单词之间由空格分隔:

    \b[A-Za-z0-9_]+\b(?:\s+[A-Za-z0-9_]+)*\.
    
  • 匹配一个行首或行尾的空白字符:

    ^\s+|\s+$
    
  • 匹配一个字符串中的所有单词边界,可以用来统计字符串中的单词数量:

    \b
    

其他知识点

passwd 文件的每一行用“:”分隔为7个字段,各个字段的内容如下。
用户名:加密口令:UID: GID:用户的描述信息:主目录:命令解释器(登录shell)

比如:user1:x:1002:1002::/home/user1:/bin/bash

cat /etc/group 查看 group 文件:
组名称:组口令(一般为空,用x占位):GID:组成员列表

比如:user1:x:1002:

文件各种属性信息中的文件类型权限中的文件类型:

  1. 普通文件(-):
    • 表示这是一个标准文件。
    • 例如:-rw-r--r-- 表示一个普通文件,具有读和写权限的设置。
  2. 目录(d):
    • 表示这是一个目录。
    • 例如:drwxr-xr-x 表示一个目录,具有写权限和执行(访问)权限。
  3. 符号链接(l):
    • 表示这是一个指向另一个文件或目录的符号链接。
    • 例如:lrwxrwxrwx 表示一个符号链接,具有读、写和执行权限。
  4. 字符设备文件(c):
    • 表示这是一个字符设备文件。
    • 例如:crw-r--r-- 表示一个字符设备文件,通常用于设备如键盘或串行端口。
  5. 块设备文件(b):
    • 表示这是一个块设备文件。
    • 例如:brw-r--r-- 表示一个块设备文件,通常用于设备如硬盘。
  6. FIFO(命名管道,p):
    • 表示这是一个 FIFO 命名管道,用于进程间通信。
    • 例如:prw-r--r-- 表示一个 FIFO 命名管道。
  7. 套接字(s):
    • 表示这是一个套接字文件,用于进程间通信或网络通信。
    • 例如:srwxr-xr-x 表示一个套接字。

文件类型是文件权限字符串的第一个字符,紧接着是关于文件所有者、所属组和其他用户权限的设置。使用 ls -l 命令可以查看文件的权限和类型。例如:

-rw-r--r-- 1 user group 1024 Jan 01 00:00 file.txt
drwxr-xr-x 2 user group 4096 Jan 01 00:00 directory
lrwxrwxrwx 1 user group   12 Jan 01 00:00 symlink -> target
crw--w----+ 1 root tty 136, 2 Jan 01 00:00 /dev/ttyS0

使用 firewalld 服务使用 firewall 命令。

free 命令主要用于查看系统内存、虚拟内存大小以及占用情况。

cat 命令用于滚动显示文件内容,将多个文件合并成一个。

ls 用于列出文件或者目录信息。

实验一

(一)文件与目录操作命令

  1. 查看用户所处当前目录:

    pwd
    
  2. 切换到 / 目录:

    cd /
    
  3. 拷贝文件到 /root 目录:

    cp /etc/inittab /root/
    
  4. 统计文件的字节数、行数、字数:

    wc -c /etc/inittab
    wc -l /etc/inittab
    wc -w /etc/inittab
    
  5. 在 /root 目录下创建 test 目录:

    mkdir /root/test
    
  6. 复制 /etc 目录及其内容到 test 目录:

    cp -r /etc/* /root/test/
    
  7. 将 test 目录改名为 test2:

    mv /root/test /root/test2
    
  8. 删除 test2 目录:

    rm -r /root/test2
    

(二)grep

  1. 查找含有 ‘a’ 的行:

    grep 'a' filename.txt
    
  2. 查找含有多个 ‘a’ 的行:

    grep -E 'a+' filename.txt
    
  3. 查找只有 ‘a’ 的行:

    grep '^a$' filename.txt
    
  4. 查找有连续 ‘a’ 的行:

    grep -E 'a{2,}' filename.txt
    
  5. 查找全是 ‘a’ 的行:

    grep -E '^a+$' filename.txt
    
  6. 查找没有 ‘a’ 的行:

    grep -v 'a' filename.txt
    
  7. 查找空行:

    grep -E '^$' filename.txt
    
  8. 统计 ‘redhat’ 出现的次数:

    grep 'redhat' filename.txt | wc -l
    

(三)find

  1. 列出所有 .c 文件:

    find . -name '*.c'
    
  2. 列出所有文件:

    find .
    
  3. 列出最近 20 天内更新过的文件:

    find . -mtime -20
    
  4. 查找 /var/log 目录中更改时间在 7 日以前的普通文件:

    find /var/log -type f -mtime +7 -exec ls -l {} \;
    
  5. 查找文件属主具有读、写权限的文件:

    find . -type f -perm /u=rw
    
  6. 查找文件长度为 0 的普通文件:

    find . -type f -size 0
    
  7. 查找 /root 下 3 分钟内访问过的 *.txt 文件并复制:

    find /root -name "*.txt" -amin -3 -exec cp {} /tmp \;
    

(四)sort, cut, uniq 等命令

  1. 按 Java 和离散数学成绩排序:

    sort -t' ' -k 5,5n -k 4,4nr student.txt
    
  2. 提取姓名和 Linux 成绩:

    cut -d' ' -f 1,6 student.txt
    
  3. 按籍贯统计学生人数:

    cut -d' ' -f 2 student.txt | sort | uniq -c
    
  4. 找出 C 语言成绩最高的前五名学生:

    sort -t' ' -k 3,3nr student.txt | head -5
    
  5. 找出 C 语言不同成绩及出现次数:

    cut -d' ' -f 3 student.txt | sort | uniq -c
    

实验二

绝大部分上面都讲过,这里挑一些没讲的重点写下。

把目录test及其下的所有文件的所有者改成st1,所属组改成st1

chown -R st1:st1 test

umask 命令用于设置默认文件权限掩码。当运行 umask 命令时,它会显示当前的掩码值。如果运行 umask 003,它会将掩码设置为 003。

  1. 查看当前 umask 值:

    umask
    

    这会显示一个四位八进制数字(默认为 0022)。

  2. 设置 umask 为 003:

    umask 003
    

    这不会有任何输出,但会改变 umask 设置。

  3. 使用 touch 命令创建一个新文件 af.txt:

    touch af.txt
    
  4. 查看 af.txt 的权限:

    ls -l af.txt
    

    这会输出类似如下的信息:

    -rw-rw-r-- 1 user group 0 date time af.txt
    

默认情况下,新文件的权限是 666(rw-rw-rw-),表示所有者、组和其他用户都有读写权限。

umask 的作用是从默认权限中减去(掩码)相应的权限位。因此:

  • 默认文件权限:666
  • umask:003

计算新的文件权限:

  • 默认文件权限减去 umask:666 - 003 = 664(即 rw-rw-r–)

这意味着新创建的文件 af.txt 会有权限 664,即所有者和组用户有读写权限,而其他用户只有读取权限。

新建组 student

groupadd student

新建用户userl,指定其主目录为/userl,组为st1,附加组为student,指定shell为/bin/bash

useradd -d /userl -g st1 -G student -s /bin/bash userl

修改用户 userl 的个人说明:

usermod -c "This is a test" userl

修改用户 user1 密码过期时间:

passwd -e user1

更改用户 userl 的密码:

passwd userl

加锁用户 user1:

usermod -L user1

删除用户 user1 并删除其主目录:

userdel -r user1

将用户 st2 添加到附加组 student:

usermod -a -G student st2

将用户 st2 从附加组 student 中删除:

gpasswd -d st2 student

压缩和解压

  1. 打包 test 目录为 test.tar:

    tar -cf test.tar test
    
  2. 打包并压缩 test 目录为 test.tar.gz:

    tar -czf test.tar.gz test
    
  3. 查看 test.tar 中的文件目录列表:

    tar -tf test.tar
    
  4. 复制并解压 test.tar.gz 到 test1 目录:

    mkdir test1
    cp test.tar.gz test1
    cd test1
    tar -xzvf test.tar.gz
    ls -l
    

sed

  1. 输出1-3行之外的行:

    sed '1,3d' test.txt
    
  2. 显示含有两个及以上 ‘p’ 的行:

    sed -n '/p.*p/p' test.txt
    
  3. 显示含有连续两个及以上 ‘p’ 的行:

    sed -n '/pp/p' test.txt
    
  4. 含有重复字母的行:

    sed -n '/\(.\)\1/p' test.txt
    
  5. 含有连续重复字母的行:

    sed -n '/\(.\)\1\1/p' test.txt
    
  6. 删除第三行:

    sed '3d' test.txt
    
  7. 将替换第三行为 ‘abc123’:

    sed '3cabc123' test.txt
    
  8. 将所有的 ‘na’ 替换为 ‘12’:

    sed 's/na/12/g' test.txt
    
  9. 将所有3个长度的单词两边加 # 号:

    sed 's/\b\(\w\{3\}\)\b/#\1#/g' test.txt
    
  10. 将文中 ‘a’ 替换为 ‘1’, ‘b’ 替换为 ‘2’, ‘c’ 替换为 ‘3’:

    sed 'y/abc/123/' test.txt
    
  11. 将含有 ‘apple’ 或 ‘pear’ 的行,其中的 ‘red’ 替换成 ‘xxx’:

    sed -n '/\(apple\|pear\)/s/red/xxx/p' test.txt
    
  12. 将文件中以 ‘a’ 开头的并且含有 ‘red’ 的行中的所有 ‘sky’ 替换成 ‘xxx’:

    sed -n '/^a.*red/s/sky/xxx/p' test.txt
    
  13. 将 ‘red’ 或 ‘sky’ 替换为 ‘xxx’:

    sed 's/red\|sky/xxx/g' test.txt
    
  14. 将 ‘sky’ 替换为 ‘xxx’, 将 ‘red’ 替换为 ‘yyy’:

    sed -e 's/sky/xxx/g' -e 's/red/yyy/g' test.txt
    
  15. 在第3行后添加一行内容为 “hello world”:

    sed '3a hello world' test.txt
    
  16. 显示不以 ‘a’ 开始的行:

    sed '/^a/!p' test.txt
    

awk

  1. 输出含有 ‘o’ 同时含有 ‘f’ 的行:

    awk '/o/ && /f/' test.txt
    
  2. 输出含有 ‘o’ 或含有 ‘f’ 的行:

    awk '/o/ || /f/' test.txt
    
  3. 输出第3列或第5列小于60的行:

    awk '$3<60 || $5<60' student.txt
    
  4. 打印每个人的姓名和总分:

    awk '{sum = $3 + $4 + $5 + $6; print $1, sum}' student.txt
    
  5. 打印有不及格的学生信息:

    awk '$3<60 || $4<60 || $5<60 || $6<60 || $7<60' student.txt
    
  6. 打印没有不及格的学生信息:

    awk '$3>=60 && $4>=60 && $5>=60 && $6>=60 && $7>=60' student.txt
    
  7. 计算第4列的平均成绩:

    awk '{sum += $4} END {print sum/NR}' student.txt
    
  8. 分别统计第5列成绩在不同分数段的人数:

    awk '{score=int($5/10); if (score<6) score=5; if (score==10) score=9; freq[score]++} END {for (i=0; i<=9; i++) print i*10"->"(i*10+9)",", freq[i]}' student.txt
    
  9. 总分最高的学生信息,考虑有并列的情况:

    awk '{sum=$3+$4+$5+$6+$7; if (sum>max) {max=sum; delete arr} if (sum==max) arr[$1]++;} END {for (name in arr) print name, max}' student.txt
    

关于 mount 和 umount 的使用,以下是一些基本的命令和步骤:

mount 和 umount

  1. 访问U盘:

    ① 挂载U盘:
    假设 U盘 被识别为 /dev/sdb1(请注意,实际设备名可能不同),你可以使用以下命令挂载它到 /mnt 目录:

    sudo mount /dev/sdb1 /mnt
    

    ② 使用U盘:
    进入挂载点,创建文件:

    cd /mnt
    sudo touch a.test
    sudo touch haoxiugong
    

    这些文件将出现在 U盘 上,你可以在 Windows 下查看它们。

    ③ 卸载U盘:
    使用以下命令卸载 U盘:

    sudo umount /mnt
    
  2. 访问iso文件:

    从群中下载 javaex.iso 并拷贝到 /root 目录下。

    ① 挂载iso文件:
    挂载 /root 目录下的 javaex.iso:

    sudo mount -o loop /root/javaex.iso /mnt
    

    这里 -o loop 选项创建一个回环设备,它将 .iso 文件挂载为一个虚拟光驱。

    ② 使用iso文件:
    进入挂载点,你可以访问 .iso 文件中的内容:

    cd /mnt
    ls
    

    这将列出 .iso 文件中的文件和目录。

    ③ 卸载iso文件:
    使用以下命令卸载 .iso 文件:

    sudo umount /mnt
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/869598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

千万级消息推送系统设计与实战

系统概述 功能: 支持千万级用户的消息推送&#xff0c;包括通知和透传消息&#xff0c;快速触达用户&#xff0c;提升用户留存和活跃度。接入方式: 通过API接入&#xff0c;实现消息的即时推送。管理后台: 提供网页端后台&#xff0c;便于应用授权、业务管理、消息管理及数据查…

Linux_网络编程_TCP

服务器客户端模型&#xff1a; client / server brow / ser b / s http p2p socket——tcp 1、模式 C/S 模式 》服务器/客户端模型 server :socket()-->bind()--->listen()-->accept()-->recv()-->close()client :socket()-->conn…

STM32第九课:STM32-基于标准库的42步进电机的简单I/O控制(附电机教程,看到即赚到)

一&#xff1a;步进电机简介 步进电机又称为脉冲电机&#xff0c;简而言之&#xff0c;就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩&#xff0c;步进电机的角位移量与输入的脉冲个数严格成正比…

【计算机网络】tcp协议和upd协议有什么区别

文章目录 前言一、区别TCP&#xff08;传输控制协议&#xff09;&#xff1a;UDP&#xff08;用户数据报协议&#xff09;&#xff1a; 二、总结 前言 在网络通信中&#xff0c;传输层协议起着至关重要的作用。它们负责将应用层的数据从一台机器传送到另一台机器。其中&#x…

超越单兵作战:多智能体 Multi-Agent System (MAS)

超越单兵作战&#xff1a;多智能体 Multi-Agent System (MAS) Multi-Agent System 是指一个系统中有多个智能体同时工作的情况。在这样的系统中&#xff0c;每个智能体都具有一定程度的自主性&#xff0c;可以独立执行任务、做决定&#xff0c;并且能够与其他智能体进行交互&a…

STM32的Code、RO-data、RW-data、ZI-data和RAM以及flash的关系

对于刚接触stm32编程的同学来说&#xff0c;通常不知道如何选择合适型号的芯片来开发自己的项目&#xff0c;下面就分析一下多大的片内ram以及flash能符合我们项目的需求。 不知道大家有没有注意到&#xff0c;我们的项目每次编译完成后&#xff0c;都会出现这个Program Size&…

运维团队如何应对动环监控与IT监控分离的挑战

IT与机房动环监控的一体化是当下及未来的必然趋势&#xff0c;这一模式显著节省了运维过程中的时间与成本。一体化平台不仅消除了频繁切换系统的繁琐&#xff0c;更在一个统一界面上实现了多元化的管理运维功能&#xff0c;极大地提升了工作效率。 在机房升级或新建项目中&…

亚马逊卖家告别熬夜!批量定时上下架,自动调价

必用能功三个&#xff0c;不限制上传商品。 大家好&#xff0c;今天来讲下这款erp的定时上下架功能。 打开工具这栏选择智能调价&#xff0c;点击添加智能调价选择店铺&#xff0c;选择定时上架的商品添加也可以全部添加。每个商品的价格都是不同的&#xff0c;可以点击保底价…

windows10开启防火墙,增加入站规则后不生效,还是不能访问后端程序

一、背景&#xff1a; 公司护网要求开启防火墙&#xff0c;开启防火墙后&#xff0c;前后端分离的项目调试受影响&#xff0c;于是增加入站规则开放固定的后台服务端口&#xff0c;增加的mysql端口3306和redis端口6379&#xff0c;别人都可以访问&#xff0c;但是程序的端口808…

Android C++系列:Linux进程(三)

wait/waitpid 僵尸进程: 子进程退出,父进程没有回收子进程资源(PCB),则子进程变成僵尸进程 孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为1号 进程init进程,称为init进程领养孤儿进程 #include <sys/types.h> #include <sys/wait.…

力扣7.整数反转的两种算法详解

给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2 ^31, 2 ^31 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&#xff1a; …

抖音工具箱功能菜单解析分享

一 支持视频链接 采集/点赞/评论/收藏 二 支持导入 用户id私信 内容自定义 可 关注后私信对方 私信间隔自定义 三 支持多直播间 发言 内容-间隔自定义 五 支持 监听指定用户作品 新发作品 自动 点赞/评论/收藏 六 支持 视频评论实时监控 新发评论自动采集获取 七 智能 暂停…

NLP入门——卷积语言模型的搭建、训练与预测

语言模型建模是针对句子建模&#xff0c;主要分为掩码语言模型和自回归语言模型。 我们从corpus中截取一句话作为例子&#xff0c;这句话是bpe分词后的句子&#xff1a; 1994 年 5 月 17 日 安全 理事会 第 33 77 次 会议 通过 掩码语言模型的主要机制是&#xff1a;例如将33 7…

PostgREST API 安装及基础使用

PostgREST是一个独立的Web服务器&#xff0c;它将PostgreSQL数据库转换为RESTful API。它提供基于基础数据库的结构自定义的API。 PostgREST安装 首先访问Releases PostgREST/postgrest (github.com)&#xff0c;根据安装平台选择下载的源码。比如我现在的设备是Mac但是我的…

删掉此电脑中烦人的百度网盘、WPS、迅雷下载图标(还有导航栏)-win10/11

删掉此电脑的图标 1、首先 搜索 注册表管理器 或者 win R 输入 regedit 2、在红框的地方输入这串路径&#xff08;下2选1&#xff09;&#xff1a; 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\ HKEY_CURRENT_US…

解决Linux中已安装JDK但是java找不到命令问题

报错解释&#xff1a; 这个错误表明即使在Linux系统中安装了Java Development Kit (JDK)&#xff0c;但是系统无法找到java命令。这通常是因为JDK的安装路径没有被加入到环境变量PATH中&#xff0c;导致系统无法在默认的路径下找到java执行程序。 解决方法&#xff1a; 检查J…

【C++】使用C++实现基于Socket的通信

在本文中&#xff0c;我们将详细讨论如何使用C实现基于Socket的通信&#xff0c;并设计一个TLV&#xff08;Type-Length-Value&#xff09;协议用于数据交互。TLV协议因其灵活性和可扩展性&#xff0c;在多种通信协议中被广泛使用&#xff0c;特别是在需要动态定义数据结构的场…

【Axure】产品原型如何在谷歌浏览器中打开

作为一名前端开发来说&#xff0c;在拿到产品的原型图后&#xff0c;如何打开&#xff1f;直接用谷歌浏览器打开&#xff0c;是打不开的&#xff0c;需要安装对应的插件。但是谷歌插件市场在不翻墙的情况下&#xff0c;是没有办法直接打开的&#xff0c;分享一种超级简单的方法…

深入解析RocketMQ的名字服务机制:功能、原理与应用

NameServer 是专为 RocketMQ 设计的轻量级名字服务&#xff0c;它的源码非常精简&#xff0c;八个类 &#xff0c;少于 1000 行代码。 这篇文章&#xff0c; 笔者会从基础概念、Broker 发送心跳包、NameServer 维护路由、Zookeeper vs NameServer 四个模块揭秘名字服务的设计精…

电脑怎样连接打印机?详细步骤告诉你!

在现代办公环境中&#xff0c;打印机是必不可少的设备之一。无论是打印文档、图片还是其他资料&#xff0c;连接打印机都是我们日常工作中的基本操作。然而&#xff0c;不同类型的打印机和连接方式可能会让人感到困惑。本文将介绍电脑怎样连接打印机的3种方法&#xff0c;帮助您…