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. 条件语句

    • 使用 ifthenelseelif(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. 退出状态

    • 使用 exitreturn 命令退出脚本,并可以返回一个状态码。
  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. 使用 sedinput 文件中的 \OU 字符串修改为 (ou):

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

    • 使用 -np 打印指定行:
      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. 使用 sedinput 文件中的 “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.gztest1 目录:

    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
    

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

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.mzph.cn/news/869598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;帮助您…