Assignment 1
Instructions:
Write the commands needed to solve the following problems on mis01.scu.edu. The first two problems are already solved to show you how to proceed.
Each problem will be marked with a 1 if correct, with a 0.5 if partially correct, and with a 0 otherwise.
Problem -1 (solved for you as an example)
Before solving this problem, position yourself in your own directory. Move to /home
using relative pathnames (write only one command).
Solution:
cd..
Problem 0 (solved for you as an example)
Before solving this problem, position yourself in your own directory. Move to /home/OMIS107
using relative pathnames and then move to /home
using absolute pathnames (write two commands).
Solution:
cd ../OMIS107
cd /home
Problem 1
Before solving this problem, position yourself in your own directory. Use relative pathnames to print the detailed list of files in /home/OMIS107/HW1
(one command).
ls -l ../OMIS107/HW1
Problem 2
Before solving this problem, position yourself in your own directory. Use relative pathnames to go to /home/OMIS107/HW1/irrelevant
and, from there, use relative pathnames to show the content of file /home/OMIS107/HW1/Sep26Lunch.txt
(two commands).
Solution:
cd ../OMIS107/HW1/irrelevant/
cat ../Sep26Lunch.txt
Problem 3
Before solving this problem, position yourself in your own directory. Copy the directory /home/OMIS107/HW1
into your own directory using relative pathnames and making sure that you copy any existing subdirectory as well (one command). Make sure that neither your username nor tilde (~) appear in your solution.
Solution:
cp -r ../OMIS107/HW1 .
Problem 4
If the permissions were set as shown below, which files would you NOT be allowed to read?
Solution:
Sep27Lunch.txt
给出以下 Linux 文件权限,你能解释每个权限的含义吗?
-rwxr-x---
drwxrwxr-x
-rw-------
lrwxrwxrwx
drwxr-xr-x
如果你看到一个文件的权限是
-rw-rw-r--
,那么以下哪个说法是正确的?- a) 所有用户都可以修改该文件。
- b) 只有文件所有者可以读取和修改该文件。
- c) 文件所有者和同一组的用户可以读取和修改该文件,其他用户只能读取。
- d) 只有文件所有者可以读取该文件,其他用户无法访问。
如果你想让一个文件的所有者有全部权限,同一组的用户有读取和执行权限,其他用户只有执行权限,你应该使用哪个
chmod
命令?- a)
chmod 741 filename
- b)
chmod 754 filename
- c)
chmod 647 filename
- d)
chmod 765 filename
- a)
以下哪个命令能够将文件的权限设置为
-rwxr--r--
?- a)
chmod 644 filename
- b)
chmod 754 filename
- c)
chmod 744 filename
- d)
chmod 654 filename
- a)
当然,下面是这些问题的答案以及相关的解释:
文件权限的解释:
-rwxr-x---
:这是一个普通文件。所有者拥有读取、写入和执行权限;组拥有读取和执行权限;其他用户没有任何权限。drwxrwxr-x
:这是一个目录。所有者拥有读取、写入和执行权限;组也拥有读取、写入和执行权限;其他用户拥有读取和执行权限。-rw-------
:这是一个普通文件。所有者拥有读取和写入权限;组和其他用户没有任何权限。lrwxrwxrwx
:这是一个符号链接。所有者、组和其他用户都拥有读取、写入和执行权限。drwxr-xr-x
:这是一个目录。所有者拥有读取、写入和执行权限;组和其他用户拥有读取和执行权限。
-rw-rw-r--
的权限解释:正确答案是 c)。这个权限表示,文件所有者和同一组的用户可以读取和修改文件,其他用户只能读取。设定特定权限的
chmod
命令:正确答案是 b)。chmod 754 filename
会将文件的权限设置为-rwxr-xr--
,这表示文件所有者有全部权限(读取、写入和执行),同一组的用户有读取和执行权限,其他用户只有读取权限。设置权限为
-rwxr--r--
的chmod
命令:正确答案是 c)。chmod 744 filename
会将文件的权限设置为-rwxr--r--
,这表示文件所有者有全部权限(读取、写入和执行),同一组的用户和其他用户只有读取权限。
上课 log
1. 显示隐藏文件操作
2. .
和 ..
在Linux或Unix系统中,ls -a
命令用于列出目录中的所有文件,包括隐藏文件。.
代表当前目录,..
代表上级目录。当你在终端中使用cd
命令进入一个目录时,.
代表该目录本身,而..
代表该目录的上一级目录。
inventory 1
1. cd
cd
是一个 Linux 命令,全称 "change directory"。使用 cd
命令,你可以在 Linux 文件系统中的各个目录之间进行切换。
在实际使用中,你需要在 cd
命令后添加你希望切换到的目录路径。例如,如果你想切换到 /home/user/documents
,你需要输入 cd /home/user/documents
。
一些常用的 cd
命令参数包括:
cd ..
:这会让你返回到当前目录的上级目录。cd -
:这会让你切换到之前的工作目录。cd ~
或cd
:这两个命令都会让你返回到当前用户的家目录。
请注意,Linux 系统是区分大小写的,所以在输入目录路径时需要注意大小写。此外,如果目录名称中包含空格,你需要使用引号将其包裹起来,或者使用反斜杠 \
对空格进行转义。例如,cd "My Documents"
或 cd My\ Documents
。
cd
是一个基本的 Linux 命令,用于切换当前工作目录。它的基本语法是 cd [options] [directory]
,其中 directory
是你希望切换到的目录。以下是一些常见的 cd
命令的用法和示例:
切换到具体目录:你可以通过提供目录的绝对路径或相对路径来切换到特定的目录。
绝对路径示例:
cd /home/user/documents
这个命令将你的当前工作目录切换到
/home/user/documents
。相对路径示例:
假设当前工作目录是/home/user
,你可以使用以下命令切换到documents
子目录:cd documents
切换到上级目录:你可以使用
..
来表示当前目录的父目录。示例:
cd ..
这个命令将你的当前工作目录切换到上级目录。
切换到之前的工作目录:你可以使用
-
来切换回你之前的工作目录。示例:
cd -
假设你最初在
/home/user
目录,然后你切换到/etc
,再运行cd -
会把你带回到/home/user
。切换到用户的家目录:你可以使用
~
或者不带任何参数的cd
来切换到当前用户的家目录。示例:
cd
或
cd ~
这两个命令都会将你的当前工作目录切换到当前用户的家目录,通常是
/home/username
。处理带有空格的目录名:如果目录名中包含空格,你需要在整个目录名周围加上引号,或者使用反斜杠
\
来转义空格。示例:
cd "directory with spaces"
或
cd directory\ with\ spaces
这两个命令都将你的当前工作目录切换到名为
directory with spaces
的目录。
这就是 cd
命令的主要用法。它是 Linux 中最基本且常用的命令之一,学会有效地使用它可以提高你在命令行中的效率。
2. ls
ls
是 Linux 中的一个基本命令,用于列出目录中的文件和子目录。基本语法是 ls [options] [file|dir]
,你可以在命令后面添加参数和路径。如果没有指定路径,那么 ls
将列出当前目录的内容。以下是 ls
命令的一些常见用法和示例:
基本用法:无参数的
ls
会列出当前目录的文件和子目录。示例:
ls
列出其他目录的内容:你可以在
ls
后添加目录路径,以查看该目录的内容。示例:
ls /home/user/documents
这个命令将列出
/home/user/documents
目录中的文件和子目录。长格式列表:使用
-l
参数,你可以查看文件和目录的详细信息,如文件权限、所有者、大小、最后修改时间等。示例:
ls -l
这个命令将以长格式列出当前目录的内容。
显示隐藏文件:在 Linux 中,以点(
.
)开头的文件是隐藏文件。你可以使用-a
或-A
参数列出这些文件。其中,-a
显示所有文件(包括.
和..
),而-A
不显示.
和..
。示例:
ls -a
这个命令将列出当前目录的所有文件,包括隐藏文件。
显示目录本身,而不是其内容:使用
-d
参数,你可以仅列出目录本身,而不是其内容。示例:
ls -d */
这个命令将列出当前目录的所有子目录(不包含其他文件和子目录的内容)。
递归列出文件和目录:使用
-R
参数,你可以递归地列出目录及其所有子目录的内容。示例:
ls -R
这个命令将递归地列出当前目录及其所有子目录的内容。
按照文件大小排序:使用
-S
参数,你可以按照文件大小排序。示例:
ls -S
这个命令将按照文件大小从大到小排序当前目录的内容。
按照修改时间排序:使用
-t
参数,你可以按照文件的修改时间排序。示例:
ls -lt
这个命令将按照文件的修改时间从新到旧排序,并以长格式显示。
这些就是 ls
命令的一些常见用法。记住,这些参数可以组合使用,例如 `ls
-l -a或
ls -la。请注意,不同的 Linux 发行版可能提供了更多的
ls参数选项,你可以通过
man ls` 命令查看更多信息。
让我补充一下这两个参数的示例:
-a
和 -A
都用于列出目录中的所有文件,包括以 .
(点)开头的隐藏文件。在 Unix 和类 Unix 系统(如 Linux)中,文件名以 .
开头的文件被视为隐藏文件。
这两个参数的主要区别在于 -a
参数会列出 .
和 ..
,而 -A
参数则不会。在 Unix 和类 Unix 系统中,.
代表当前目录,..
代表父目录。
ls -a
的使用示例:
ls -a
这个命令会列出当前目录中的所有文件,包括隐藏文件和 .
和 ..
。
ls -A
的使用示例:
ls -A
这个命令会列出当前目录中的所有文件,包括隐藏文件,但不包括 .
和 ..
。
在大多数情况下,你可能会更倾向于使用 ls -A
,因为 .
和 ..
在列出目录内容时通常不太有用。
在 Unix 和 Unix-like 系统(如 Linux)中,.
和 ..
是两个特殊的目录名。
.
:代表当前目录。例如,如果你在/home/user
目录中,那么.
就代表/home/user
。..
:代表上一级(父)目录。如果你在/home/user
目录中,那么..
就代表/home
。
这两个特殊的目录名在一些命令中非常有用。例如,cd ..
命令可以让你从当前目录切换到上一级目录。ls -a
命令则会列出当前目录中的所有文件,包括隐藏文件和 .
和 ..
。
3. cat
cat
是一个 Linux 命令,用于显示、复制、合并文件内容。它的名字源于 "concatenate",意为连接,因为这个命令最初是用来连接文件的。
基本语法是 cat [options] [file_names]
。如果没有指定文件名,cat
就会从标准输入(通常是键盘)读取数据。
以下是一些常用的 cat
命令的用法和示例:
显示文件内容:这是
cat
的最常见用法。例如,如果你想查看file.txt
的内容,你可以运行以下命令:cat file.txt
这个命令将在终端中打印出
file.txt
的全部内容。合并多个文件:你可以在
cat
命令后指定多个文件名,以便将这些文件的内容合并并显示在终端中。例如:cat file1.txt file2.txt
这个命令会先打印出
file1.txt
的内容,然后再打印出file2.txt
的内容。创建新文件:如果你想将多个文件的内容合并并保存到一个新文件中,你可以使用重定向操作符
>
。例如:cat file1.txt file2.txt > newfile.txt
这个命令会创建一个新文件
newfile.txt
,其中包含file1.txt
和file2.txt
的内容。添加到文件:如果你想将文件的内容添加到现有文件的末尾,而不是覆盖现有文件,你可以使用重定向操作符
>>
。例如:cat file1.txt >> file2.txt
这个命令会将
file1.txt
的内容添加到file2.txt
的末尾。显示行号:如果你想在显示文件内容时显示行号,你可以使用
-n
或--number
参数。例如:cat -n file.txt
这个命令会在每行内容前显示行号。
这些是 cat
命令的主要用法。记住,尽管 cat
在显示小文件时非常有用,但如果你试图使用 cat
来查看非常大的文件,可能会导致终端被大量数据淹没。在这种情况下,你可能会更愿意使用 less
或 more
这样的命令。
>
, >>
, <
, 和 <<
是在 Unix 和 Unix-like 系统(如 Linux)中常见的 shell 命令行重定向操作符。他们分别具有以下的含义和用途:
>
:这个操作符用于将命令的输出重定向到文件。如果文件已存在,它会被覆盖;如果文件不存在,它会被创建。例如:echo "Hello, World!" > file.txt
这个命令会将字符串 "Hello, World!" 输出到
file.txt
。如果file.txt
已存在,其原有内容会被删除。>>
:这个操作符和>
类似,但是它会将命令的输出添加到现有文件的末尾,而不是覆盖现有文件。如果文件不存在,它会被创建。例如:echo "Hello, World!" >> file.txt
这个命令会将字符串 "Hello, World!" 添加到
file.txt
的末尾。<
:这个操作符用于将文件的内容作为命令的输入。例如:sort < file.txt
这个命令会将
file.txt
的内容作为sort
命令的输入,对文件的内容进行排序,并将排序结果输出到屏幕。<<
:这是一个“Here Document”的标识,用于将输入重定向到一个运行中的程序,或者将多行字符串作为输入传递给一个命令。例如:cat << EOF Hello, This is a sample text. EOF
这个命令会打印出两行字符串。
EOF
(End Of File)是一个标识,你可以用任何文本来代替它,只要这个文本在开始和结束标识中是一样的。在开始标识和结束标识之间的所有行都会作为输入传递给cat
命令。
这就是重定向操作符的主要用法。它们是在 Unix 和 Unix-like 系统中进行文件和命令输入/输出操作的重要工具。
less
是一个在 Unix-like 系统(如 Linux)中用于查看文件内容的命令。与 more
命令相比,less
提供了更多的功能和灵活性,它允许用户前后浏览文件,而 more
命令只允许向前浏览。这就是 "less is more" 这个短语的由来。
基本语法是 less [options] file
。
以下是一些 less
命令的常见用法和示例:
查看文件:最基本的用法是使用
less
命令查看文件的内容。例如:less file.txt
这个命令会打开
file.txt
以供查看。在查看文件时,你可以使用上下箭头键或 Page Up/Page Down 键进行导航。
Page Up
和 Page Down
是计算机键盘上的两个键。在大多数键盘布局中,这两个键通常位于键盘的右上角,可能会被标记为 PgUp
和 PgDn
。
在使用文本浏览或编辑软件时,这两个键的功能通常是:
Page Up
:向上滚动一屏的内容。也就是说,按下这个键将使你看到上一屏的内容。Page Down
:向下滚动一屏的内容。也就是说,按下这个键将使你看到下一屏的内容。
在 less
命令中,这两个键的功能和上述描述相同:Page Up
将向上滚动一屏的内容,Page Down
将向下滚动一屏的内容。
例如,如果你打开了一个很大的文件,使用 less
命令浏览它,你可能会发现屏幕上只能显示文件的一部分内容。在这种情况下,你可以使用 Page Down
键向下浏览文件,使用 Page Up
键向上浏览文件。
在文件中搜索:在查看文件时,你可以按
/
键然后输入一个搜索模式(可以是一个简单的字符串或一个正则表达式)进行搜索。例如,按/
键然后输入 "hello" 会在文件中搜索 "hello"。按n
键可以跳到下一个匹配项,按N
键可以跳到上一个匹配项。less file.txt
跳到文件的开头或末尾:在查看文件时,按
g
键可以跳到文件的开头,按G
键可以跳到文件的末尾。查看行号:在查看文件时,按
=
键可以查看当前行的行号。退出 less:在查看文件时,按
q
键可以退出less
。
这就是 less
命令的一些基本用法。它有很多其他的选项和特性,可以通过 man less
命令查看详细的帮助信息。
cat
命令的设计是直接输出文件的全部内容到标准输出(通常是终端)。cat
不提供类似 less
或 more
的分页功能,也就是说,使用 cat
命令查看文件时,你不能使用 Page Up
或 Page Down
键向上或向下翻页。
这也是为什么在查看大型文件时,通常推荐使用 less
或 more
命令而不是 cat
命令。less
和 more
都提供分页功能,允许你使用 Page Up
或 Page Down
键(或它们的等价键盘操作,如 less
中的 b
和 space
)在文件中向上或向下翻页。
如果你只是想快速查看或输出小文件的内容,cat
是一个非常好的工具。但是,如果你需要在大型文件中进行导航或搜索,那么 less
或 more
会是更好的选择。
more
是一个在 Unix-like 系统(如 Linux)中用于查看文件内容的命令。它的特点是分页显示文件内容,特别适合查看大文件。
基本语法是 more [options] file
。
以下是一些 more
命令的常见用法和示例:
查看文件:最基本的用法是使用
more
命令查看文件的内容。例如:more file.txt
这个命令会打开
file.txt
以供查看。在查看文件时,你可以按空格键翻到下一页,按b
键翻到上一页。在文件中搜索:在查看文件时,你可以按
/
键然后输入一个搜索模式(可以是一个简单的字符串或一个正则表达式)进行搜索。例如,按/
键然后输入 "hello" 会在文件中搜索 "hello"。按n
键可以跳到下一个匹配项。查看文件的某部分:如果你只想查看文件的某部分,可以使用
+n
参数,其中n
是你想开始查看的行号。例如:more +10 file.txt
这个命令会从
file.txt
的第 10 行开始显示文件内容。
这就是 more
命令的一些基本用法。虽然 more
命令的功能相对简单,但在查看大文件时它非常有用。然而,less
命令提供了更多的功能和灵活性,因此很多人更喜欢使用 less
命令。你可以通过 man more
命令查看 more
命令的详细帮助信息。
less
和 more
都是 Unix-like 系统(如 Linux)中用于查看文件内容的命令。然而,它们之间有几个重要的区别:
导航:
more
命令只允许你向前浏览文件,也就是从文件的开始到结束。相比之下,less
命令允许你向前向后浏览文件。你可以在less
中使用上下箭头键或 Page Up/Page Down 键进行导航。搜索:
less
和more
都可以在文件中进行搜索,但less
提供了更多的搜索选项。在less
中,你可以使用正则表达式进行搜索,可以向前向后搜索,还可以查看所有的匹配项。性能:
less
命令在处理大文件时比more
更高效。more
命令需要一次性读取整个文件到内存中,而less
只需要读取需要显示的部分。功能:
less
命令提供了更多的功能,包括显示行号、跳到文件的开头或末尾等。
因为 less
提供了更多的功能和灵活性,所以很多人更喜欢使用 less
命令。这就是 "less is more" 这个短语的由来。
4. echo
echo
是一个在 Unix-like 系统(如 Linux)中非常常用的命令,它用于在命令行界面输出字符串或变量的值。基本语法是 echo [options] [string, variables...]
。
以下是一些常见的 echo
命令的用法和示例:
输出字符串:你可以使用
echo
命令输出一个或多个字符串。例如:echo "Hello, World!"
这个命令会在终端中打印出 "Hello, World!"。
输出变量的值:你可以使用
echo
命令输出环境变量的值。例如:echo $HOME
这个命令会在终端中打印出
HOME
环境变量的值,通常是你的家目录的路径。使用转义字符:
echo
命令支持一些转义字符,比如\n
(新行),\t
(制表符)等。要启用这些转义字符,你需要使用-e
参数。例如:echo -e "Hello,\nWorld!"
这个命令会打印出两行:第一行是 "Hello,",第二行是 "World!"。
不输出尾部的新行:
echo
命令默认会在输出的末尾添加一个新行。如果你不想输出这个新行,可以使用-n
参数。例如:echo -n "Hello, World!"
这个命令会打印出 "Hello, World!",但不会在末尾添加新行。因此,下一个终端提示符会紧接在 "Hello, World!" 后面,而不是在新的一行。
这些是 echo
命令的主要用法。你可以通过 man echo
命令查看详细的帮助信息。
5. sort
sort
是一个在 Unix-like 系统(如 Linux)中常用的命令,用于对文本文件进行排序。基本语法是 sort [options] [file...]
。
以下是 sort
命令的一些常见用法和示例:
基本的排序:最简单的
sort
命令用法就是对文件中的所有行进行排序。例如,假设我们有一个文件file.txt
,其内容如下:banana apple cherry date
我们可以使用
sort
命令对这个文件进行排序:sort file.txt
这将输出:
apple banana cherry date
数值排序:默认情况下,
sort
命令会按照字母顺序进行排序。如果你想按照数值进行排序,可以使用-n
选项。例如:echo -e "10\n2\n100" | sort -n
这将输出:
2 10 100
反向排序:如果你想按照反向顺序进行排序,可以使用
-r
选项。例如:echo -e "c\nb\na" | sort -r
这将输出:
c b a
根据列排序:如果你有一个以某种分隔符(如空格或制表符)分隔的多列数据,你可以使用
-k
选项指定按照哪一列进行排序。例如:echo -e "1 z\n2 y\n3 x" | sort -k 2
这将按照第二列进行排序,输出:
3 x 2 y 1 z
检查是否已排序:如果你想检查一个文件是否已经排序,你可以使用
-c
选项。如果文件已经排序,sort -c
命令将不输出任何内容并返回 0。如果文件没有排序,sort -c
命令将输出第一个未排序的行并返回非零值。
这些是 sort
命令的一些主要用法。你可以通过 man sort
命令查看详细的帮助信息。
可以的,Linux的sort
命令允许你降序(反向)排列文件中的行。具体来说,-r
选项可以实现降序排列。
假设你有一个名为file.txt
的文件,并且你希望根据每行的数值降序排列,你可以这样操作:
sort -rn file.txt
这里,-r
选项表示“反向”(即降序),而-n
选项表示“数值排序”。如果你不包含-n
选项,sort
命令将按照字符的字典顺序进行排序,这可能会导致数字10出现在数字2之前。
如果你想按字典顺序的反向排列,你可以省略-n
选项,就像这样:
sort -r file.txt
在这两个命令中,排序结果会输出到控制台。如果你希望将结果保存到另一个文件中,你可以使用重定向操作,例如:
sort -rn file.txt > sorted_file.txt
在你提供的数据示例中,sort -n -k 1,2 dem.txt
已经按照你的期望对数据进行了排序。这是因为 -k 1,2
命令指定了排序应该基于第一和第二个字段,而 -n
指定了排序应该按照数值进行(这在这个特定的例子中并不重要,因为第一列的值都是唯一的)。
然而,如果你的实际数据与你提供的示例不同,可能会出现意外的结果。sort -n -k 1,2
将首先根据第一字段进行排序,然后在第一字段相同的行中根据第二字段进行排序。此外,第二字段的排序将是字典序,而不是数值排序,即使你使用了 -n
选项。
例如,如果你有以下数据:
1 z
1 y
1 x
2 a
2 b
2 c
sort -n -k 1,2 dem.txt
将产生以下结果:
1 x
1 y
1 z
2 a
2 b
2 c
这是因为,虽然第一字段相同(即都是1),但第二字段在字典序下是 x < y < z
。
如果你需要第二字段以数值排序而非字典序,你可能需要使用更复杂的命令或不同的工具,例如 awk
。如果你提供更具体的数据和你想要达到的结果,我可能可以给出更具体的建议。
6. |
在 Unix-like 系统(如 Linux)中,竖线 |
被称为管道(pipe)。它用于将一个命令的输出作为另一个命令的输入。这是一种非常强大的功能,可以用来链接多个命令以执行复杂的操作。
以下是一些使用管道的示例:
链接多个命令:你可以使用管道链接多个命令。例如,你可以使用
ls
命令列出目录的内容,然后使用grep
命令搜索特定的文件。例如:ls -l | grep ".txt"
这个命令会在当前目录的文件列表中搜索所有
.txt
文件。使用
sort
和uniq
命令删除重复的行:你可以使用管道链接sort
和uniq
命令来删除文件中的重复行。例如:sort file.txt | uniq
这个命令会先使用
sort
命令对file.txt
文件进行排序,然后使用uniq
命令删除重复的行。使用
echo
和bc
命令进行计算:你可以使用管道链接echo
和bc
命令进行计算。例如:echo "5 + 2" | bc
这个命令会计算 "5 + 2" 的结果并输出。
使用
curl
和jq
命令处理 JSON 数据:如果你安装了curl
和jq
,你可以使用它们处理 JSON 数据。例如:curl -s "https://api.github.com/users/octocat" | jq '.login'
这个命令会获取 GitHub 用户 "octocat" 的信息,并使用
jq
命令输出其登录名。
这些都是管道的一些常见用法。通过使用管道,你可以将多个命令组合起来创建复杂的脚本和一次性命令。你可以在 bash 或其他 Unix-like shell 的文档中找到更多关于管道的信息。
base
在 jq
工具中,.
符号代表当前处理的 JSON 数据对象。当你要提取某个特定的属性时,需要使用 .
符号来指向当前对象,然后跟上你要提取的属性名。
例如,假设你有一个 JSON 对象如下:
{
"name": "John",
"age": 30,
"city": "New York"
}
如果你想提取 name
属性的值,你就需要使用 .name
作为 jq
的参数:
echo '{"name":"John", "age":30, "city":"New York"}' | jq '.name'
这将输出 "John"
。这里的 .
符号代表当前的 JSON 对象,name
就是我们想要提取的属性。
同样的,如果你的 JSON 对象包含嵌套的对象或数组,你可以使用 .
符号来访问这些嵌套的元素。例如,.person.name
将提取 person
对象中的 name
属性,.people[]
将提取 people
数组中的所有元素。
在 jq
工具中,.
符号是非常重要的,它代表了当前处理的 JSON 对象。你几乎在所有的 jq
表达式中都会看到这个符号。
嵌套
首先,假设我们有如下的 JSON 数据:
{
"person": {
"name": "John",
"age": 30,
"address": {
"city": "New York",
"country": "USA"
}
}
}
在这个 JSON 数据中,我们有一个 person
对象,这个对象中又包含了一个嵌套的 address
对象。我们可以使用 jq
提取这些嵌套的数据。
例如,如果我们想提取 name
属性,我们可以使用 .person.name
:
echo '{"person":{"name":"John", "age":30, "address":{"city":"New York", "country":"USA"}}}' | jq '.person.name'
这将输出 "John"
。
如果我们想提取 city
属性,我们可以使用 .person.address.city
:
echo '{"person":{"name":"John", "age":30, "address":{"city":"New York", "country":"USA"}}}' | jq '.person.address.city'
这将输出 "New York"
。
如果我们的 JSON 数据包含数组,我们可以使用 []
符号来提取数组中的元素。例如,假设我们的 JSON 数据如下:
{
"people": [
{"name": "John", "age": 30},
{"name": "Jane", "age": 25}
]
}
我们可以使用 .people[].name
来提取所有人的名字:
echo '{"people":[{"name":"John", "age":30},{"name":"Jane", "age":25}]}' | jq '.people[].name'
这将输出:
"John"
"Jane"
在 jq
工具中,.
符号和 []
符号可以帮助我们处理复杂的 JSON 数据结构。你可以在 jq
的文档中找到更多关于这个工具的信息。
echo '{"people":[{"name":"John", "age":30},{"name":"Jane", "age":25}]}' | jq '.people[0]'
输出:
{
"name": "John",
"age": 30
}
可以,你可以使用管道(|
)将 ls -l
的输出重定向到 grep
命令,并使用正则表达式来匹配多种文件后缀。具体来说,你可以使用竖线字符(|
),在正则表达式中它表示“或”关系。
以下是一个例子,它匹配 .txt
或 .csv
文件:
ls -l | grep -E "\.(txt|csv)$"
在这个命令中,-E
选项告诉 grep
使用扩展的正则表达式。字符串 "\.(txt|csv)$"
是一个正则表达式,匹配以 .txt
或 .csv
结尾的行。
注意,正则表达式中的字符需要被适当地转义。例如,.
在正则表达式中表示任何字符,所以如果你想匹配实际的 .
字符,你需要写成 \.
。同样,$
在正则表达式中表示行的结束,所以 \.txt$
只匹配以 .txt
结尾的行。
你可以添加更多的文件类型,只需在竖线字符后添加更多的后缀名即可,如:"\.(txt|csv|jpg|png)$"
。
7. grep
grep
是一个在 Unix-like 系统(如 Linux)中常用的命令,用于搜索文件中的文本。grep
命令可以接受正则表达式,这使得它非常灵活和强大。基本语法是 grep [options] pattern [file...]
。
以下是 grep
命令的一些常见用法和示例:
基本的搜索:最基本的
grep
用法就是在一个或多个文件中搜索特定的文本。例如:grep 'Hello' file.txt
这将在
file.txt
文件中搜索所有包含Hello
的行。忽略大小写:如果你想在搜索时忽略大小写,可以使用
-i
选项。例如:grep -i 'hello' file.txt
这将在
file.txt
文件中搜索所有包含hello
(无论大小写)的行。列出匹配文件:如果你只想知道哪些文件包含匹配的文本,而不关心具体的行,你可以使用
-l
选项。例如:grep -l 'Hello' file1.txt file2.txt
这将列出所有包含
Hello
的文件名。使用正则表达式:
grep
支持正则表达式,这使得它可以进行更复杂的搜索。例如:grep 'H.*o' file.txt
这将在
file.txt
文件中搜索所有以H
开始,以o
结束的行。显示行号:如果你想知道匹配的行在文件中的位置,你可以使用
-n
选项。例如:grep -n 'Hello' file.txt
这将在
file.txt
文件中搜索所有包含Hello
的行,并显示这些行的行号。递归搜索:如果你想在一个目录及其所有子目录中搜索文件,你可以使用
-r
或-R
选项。例如:grep -r 'Hello' /path/to/directory/
这将在
/path/to/directory/
及其所有子目录中搜索所有包含Hello
的行。
这些是 grep
命令的一些主要用法。你可以通过 man grep
命令查看详细的帮助信息。
可以的,你可以将 grep
的输出重定向到一个文件中。在 Linux 和 Unix 系统中,你可以使用 >
或 >>
这样的重定向运算符来实现。
下面是两个例子:
使用
>
写入文件:这将会覆盖文件中已有的内容。例如,你可以使用以下命令将grep
的结果写入一个文件:grep 'pattern' file.txt > output.txt
在这个命令中,
grep 'pattern' file.txt
将输出包含指定模式的行,> output.txt
将把这些行写入output.txt
文件中。如果output.txt
文件已经存在,这个命令将会覆盖文件中的内容。使用
>>
写入文件:这将会在文件的末尾添加内容,而不会覆盖已有的内容。例如:grep 'pattern' file.txt >> output.txt
在这个命令中,
>> output.txt
将把grep
的结果追加到output.txt
文件的末尾,而不是覆盖文件中的内容。
请注意,如果你没有写权限或者磁盘空间不足,这些命令可能会失败。在这种情况下,你需要检查你的权限或者磁盘空间,或者选择一个不同的目标文件。
8. uniq
uniq
是 Unix 和 Linux 系统中的一个工具,用于从输入中过滤掉重复的行。它通常与 sort
命令一起使用,因为 uniq
只能识别相邻的重复行。
以下是 uniq
命令的一些常见用法和示例:
基本用法:最简单的
uniq
用法是直接使用它来过滤掉重复的行。例如:sort file.txt | uniq
首先,
sort
命令将file.txt
文件的行排序,然后uniq
命令删除相邻的重复行。显示每行出现的次数:如果你想知道每行出现的次数,你可以使用
-c
选项。例如:sort file.txt | uniq -c
这将显示
file.txt
文件中每行出现的次数。只显示唯一的行:如果你只想显示出现一次的行(即不重复的行),你可以使用
-u
选项。例如:sort file.txt | uniq -u
这将只显示
file.txt
文件中不重复的行。只显示重复的行:如果你只想显示至少出现两次的行(即重复的行),你可以使用
-d
选项。例如:sort file.txt | uniq -d
这将只显示
file.txt
文件中重复的行。
这些是 uniq
命令的主要用法。你可以通过 man uniq
命令查看详细的帮助信息。
让我通过一个例子来解释 "删除相邻的重复行" 这个概念。
假设我们有一个文件 file.txt
,内容如下:
apple
banana
apple
banana
apple
pear
banana
pear
apple
如果我们直接使用 uniq
命令,结果将如下:
$ uniq file.txt
输出:
apple
banana
apple
banana
apple
pear
banana
pear
apple
你会发现,尽管 "apple" 和 "banana" 在文件中多次出现,但 uniq
命令并没有删除这些重复的行。这是因为 uniq
命令只删除相邻的重复行。
现在,如果我们先用 sort
命令将文件排序,再使用 uniq
命令,结果将如下:
$ sort file.txt | uniq
输出:
apple
banana
pear
在 sort
命令的作用下,所有相同的行(比如 "apple"
、"banana"
、"pear"
)都被排列在一起,成为了相邻的行。然后 uniq
命令就能成功地删除这些重复的行。
这就是 "删除相邻的重复行" 的含义,也是为什么我们通常会在使用 uniq
命令之前先使用 sort
命令的原因。
9. bc
bc
(Binary Calculator)是 Unix-like 系统(如 Linux)中的一个任意精度计算器语言。你可以使用 bc
命令进行各种数学计算。
以下是 bc
命令的一些常见用法和示例:
基本的计算:你可以在命令行中使用
bc
进行基本的数学运算。例如,如果你想计算3 + 4
,你可以使用以下命令:echo '3 + 4' | bc
这将输出
7
。使用变量:
bc
支持使用变量进行计算。例如,以下命令将计算a * b
,其中a
是 5,b
是 6:echo 'a=5; b=6; a*b' | bc
这将输出
30
。浮点数计算:默认情况下,
bc
命令执行的是整数运算。如果你想进行浮点数运算,你需要设置scale
变量,这个变量决定了小数点后的位数。例如,以下命令将计算1 / 3
,并显示小数点后 3 位:echo 'scale=3; 1/3' | bc
这将输出
0.333
。高级数学函数:
bc
也支持一些高级的数学函数,比如平方根(sqrt)、指数(e)、自然对数(l)。为了使用这些高级函数,你需要使用-l
选项启动bc
。例如,以下命令将计算平方根sqrt(4)
:echo 'sqrt(4)' | bc -l
这将输出
2
。
以上是 bc
命令的一些基本用法。你可以在 bc
的手册页(通过 man bc
命令查看)中找到更多详细的信息。
10. cp
cp
是 Unix 和 Linux 系统中的一个基本命令,用于复制文件和目录。cp
命令的基本语法是 cp [options] source destination
,其中 source
是你想要复制的文件或目录,destination
是复制的目标位置。
以下是 cp
命令的一些常见用法和示例:
复制文件:最基本的
cp
用法是复制单个文件。例如:cp source.txt destination.txt
这将复制
source.txt
文件到destination.txt
。如果destination.txt
文件已存在,这个命令将覆盖它。复制目录:如果你想复制整个目录及其内容,你需要使用
-R
或-r
选项。例如:cp -R source_directory/ destination_directory/
这将复制
source_directory
及其所有内容(包括子目录和文件)到destination_directory
。保留文件属性:如果你想在复制文件或目录时保留其原有的属性(如所有权和权限),你可以使用
-p
选项。例如:cp -p source.txt destination.txt
这将保留
source.txt
文件的所有权和权限。交互式复制:如果你不希望
cp
命令在复制时覆盖已存在的文件,你可以使用-i
选项。这将使cp
命令在覆盖文件之前询问你的确认。例如:cp -i source.txt destination.txt
如果
destination.txt
文件已存在,这个命令将询问你是否要覆盖它。
以上是 cp
命令的一些常见用法。你可以通过 man cp
命令查看更详细的帮助信息。
-p
的时候,会怎么样?当你使用 cp
命令复制文件或目录时,如果不指定 -p
选项,那么默认情况下,新复制的文件或目录将不会保留原始文件或目录的属性。
更具体地说:
所有权:新复制的文件或目录将被赋予当前用户和用户组的所有权,而不是原始文件或目录的所有权。
权限:新复制的文件或目录将根据当前用户的 umask 设置来确定权限,而不是保留原始文件或目录的权限。
时间戳:新复制的文件或目录将具有当前的时间戳,而不是原始文件或目录的时间戳。
如果你想在复制文件或目录时保留这些属性,你应该使用 -p
选项。例如:
cp -p source.txt destination.txt
这将复制 source.txt
文件到 destination.txt
,并保留文件的所有权、权限和时间戳。
在 Linux 中,cp
命令后面跟随的特殊字符(*
、[]
、.
等)被称为通配符(wildcards),它们在匹配文件和目录时有特殊的含义:
*
:匹配任意数量的任意字符。例如,*.txt
匹配所有以.txt
结尾的文件。?
:匹配任意一个字符。例如,?.txt
匹配所有单个字符的.txt
文件,如a.txt
、b.txt
等。[]
:匹配括号内的任意一个字符。例如,[abc].txt
匹配a.txt
、b.txt
和c.txt
。{}
:匹配大括号中的任何一个字符串。例如,{a,b,c}.txt
会匹配a.txt
、b.txt
和c.txt
。.
:在文件或目录名中,.
表示当前目录。在隐藏文件或目录的名称前,.
也表示隐藏属性。例如,.config
是一个隐藏文件。
注意,使用这些通配符时,你应确保它们正确地匹配到你希望操作的文件和目录。
这就是 Linux 中 cp
命令后面跟随的特殊字符的含义。在实际使用时,你可能需要根据具体情况调整命令的参数。
让我们通过一些具体的操作来更深入地理解这些通配符的作用。
首先,我们在当前目录下创建一个新的目录 testdir
,然后在 testdir
下创建一些文件:
mkdir testdir
cd testdir
touch file123 file154 file180 apple180 banana130 cherry170 jenny239 jenny32
现在,我们已经创建了 file123
、file154
、file180
、apple180
、banana130
、cherry170
这些文件。现在,我们可以尝试使用 cp
命令配合通配符来复制文件。
- 复制以
1
后跟一个 2 到 7 之间的数字,再后跟一个任意数字结束的文件:
mkdir copy1
cp *1[2-7][0-9] copy1/ # 1 就是匹配数字开头,可以改成 2 自行测试
这条命令会将 file123
和 file154
复制到 copy1/
目录,因为这两个文件名都匹配 *1[2-7][0-9]
的模式。
- 复制以
180
结束的文件:
mkdir copy2
cp *180 copy2/
这条命令会将 file180
和 apple180
复制到 copy2/
目录,因为这两个文件名都匹配 *180
的模式。
你可以通过 ls
命令来查看 copy1/
和 copy2/
目录,确认这些操作的结果:
ls copy1/
ls copy2/
cp
命令会覆盖目标目录中同名的文件。
如果你在命令行中使用 cp
命令复制文件,而目标目录中已经存在同名的文件,那么 cp
命令会直接覆盖目标目录中的同名文件,不会进行任何提示。
这是 cp
命令的默认行为。如果你希望在覆盖文件之前得到提示,可以使用 -i
(interactive)选项,如:cp -i sourcefile targetfile
。这样,在覆盖文件之前,系统会询问你是否确定要覆盖。
如果你想在复制文件的同时保留原始文件,你可以使用 cp
命令。cp
命令的基本操作就是在复制文件的同时保留源文件。换句话说,源文件在复制操作后仍然存在。示例如下:
cp source.txt destination.txt
这将创建 destination.txt
的一个副本,同时 source.txt
仍然保持不变。
但如果你的意思是在目标位置已有同名文件时,你想要保留那个原始的目标文件,那么你可以使用 cp
命令的 -b
(或 --backup
)选项。这将会在覆盖之前为目标文件创建一个备份。例如:
cp -b source.txt destination.txt
这将会在复制 source.txt
到 destination.txt
之前,为 destination.txt
创建一个备份文件,名为 destination.txt~
。
注意,-b
选项可能并非所有系统的 cp
命令都支持。你可以通过 man cp
或 cp --help
来查看你的系统中的 cp
命令是否支持这个选项。
11. 文件权限
Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。
为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
在 Unix 和 Linux 系统中,文件和目录的权限是由三类用户和三种权限类型决定的。
三类用户包括文件的拥有者(user)、同一用户组的其他用户(group)和所有其他用户(others)。
三种权限类型包括读取(read)、写入(write)和执行(execute)。
以下是 Linux 文件权限的符号含义:
- -:表示这是一个普通文件。
- d:表示这是一个目录。
- r:表示拥有者、用户组或其他用户有读取权限。
- w:表示拥有者、用户组或其他用户有写入权限。
- x:表示拥有者、用户组或其他用户有执行权限。
例如,一个文件的权限可能如下所示:
-rwxr-xr--
这个权限字符串可以分成四个部分:
- 第一个字符表示文件类型,
-
表示这是一个普通文件,d
表示这是一个目录。 - 接下来的三个字符
rwx
表示文件拥有者的权限。r
表示拥有者有读取权限,w
表示拥有者有写入权限,x
表示拥有者有执行权限。 - 再接下来的三个字符
r-x
表示用户组的权限。r
表示用户组有读取权限,-
表示用户组没有写入权限,x
表示用户组有执行权限。 - 最后三个字符
r--
表示所有其他用户的权限。r
表示其他用户有读取权限,--
表示其他用户没有写入和执行权限。
所以,这个权限字符串表示这是一个普通文件,文件拥有者有读、写和执行权限,用户组有读和执行权限,所有其他用户只有读取权限。
在 Linux 系统中,你可以使用 chmod
命令改变文件或目录的权限。例如,如果你想让文件拥有者、用户组和所有其他用户都有读、写和执行权限,你可以使用以下命令:
chmod 777 filename
在这个命令中,777
是一个八进制数字,表示所有用户都有读(4)、写(2)和执行(1)权限(4+2+1=7)。第一个 7
表示文件拥有者的权限,第二个 7
表示用户组的权限,第三个 7
表示所有其他用户的权限。
在 Linux 系统中,文件或目录的权限可以通过 ls -l
命令查看。ls -l
命令的输出包含了很多信息,其中第一列就是文件或目录的权限字符串。权限字符串总共有 10 个字符,它们的含义如下:
第一个字符表示文件类型:
-
:表示这是一个普通文件。d
:表示这是一个目录。l
:表示这是一个符号链接。- 其他的字符表示其他特殊类型的文件(如设备文件和管道文件)。
接下来的三个字符表示文件拥有者的权限:
r
:表示拥有者有读取权限。w
:表示拥有者有写入权限。x
:表示拥有者有执行权限。-
:表示相应的权限不存在。
再接下来的三个字符表示用户组的权限:
- 和文件拥有者的权限一样,这三个字符分别表示用户组的读取、写入和执行权限。
最后三个字符表示所有其他用户的权限:
- 和文件拥有者的权限一样,这三个字符分别表示所有其他用户的读取、写入和执行权限。
现在,让我们通过一些例子来看看这些权限是如何工作的。
例如,假设你运行了 ls -l
命令,得到了以下的输出:
drwxr-xr-x 2 root root 4096 May 30 16:34 directory
-rw-r--r-- 1 root root 1024 May 30 16:34 file
在这个例子中,directory
是一个目录,file
是一个普通文件。我们可以从权限字符串中看出它们的权限:
对于
directory
,权限字符串是drwxr-xr-x
:d
表示这是一个目录。- 第一组的
rwx
表示文件拥有者(在这个例子中是root
用户)有读取、写入和执行权限。对于目录,执行权限表示可以列出目录的内容。 - 第二组的
r-x
表示用户组(在这个例子中也是root
用户组)有读取和执行权限,但没有写入权限。 - 第三组的
r-x
表示所有其他用户也有读取和执行权限,但没有写入权限。
对于
file
,权限字符串是-rw-r--r--
:-
表示这是一个普通文件。- 第一组的
rw-
表示文件拥有者有读取和写入权限,但没有执行权限。对于普通文件,执行权限表示可以运行这个
文件作为程序。
- 第二组和第三组的 r--
表示用户组和所有其他用户只有读取权限,没有写入和执行权限。
这就是 Linux 文件权限的基本原理。如果你想改变文件或目录的权限,你可以使用 chmod
命令。例如,如果你想让所有用户都有 file
的读取和写入权限,你可以运行 chmod 666 file
命令。在这个命令中,666
是一个八进制数字,表示所有用户都有读(4)和写(2)权限(4+2=6)。
在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限:
- chown (change owner) : 修改所属用户与组。
- chmod (change mode) : 修改用户的权限。
下图中通过 chown 来授权用户,通过 chmod 为用户设置可以开门的权限。
在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组,如:
[root@www /]# ls -l
total 64
dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin
dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
……
实例中,bin 文件的第一个属性用 d 表示。d 在 Linux 中代表该文件是一个目录文件。
在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。
- 当为 d 则是目录
- 当为 - 则是文件;
- 若是 l 则表示为链接文档(link file);
- 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
- 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
从左至右用 0-9 这些数字来表示。
第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。
第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
其中,第 1、4、7 位表示读权限,如果用 r 字符表示,则有读权限,如果用 - 字符表示,则没有读权限;
第 2、5、8 位表示写权限,如果用 w 字符表示,则有写权限,如果用 - 字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 - 字符表示,则没有执行权限。
11.1 Linux 连接数是什么意思?
在 Linux 中,"连接数"(也称为硬链接数或链接计数)通常指的是一个文件或目录的硬链接数量。
硬链接是文件系统中的一个引用或指向文件数据的指针。每当创建一个硬链接,文件的链接计数就会增加。每当删除一个硬链接,文件的链接计数就会减少。当链接计数达到0时,文件的数据块将被释放,该文件即被删除。
对于目录,链接数还包括子目录的数量。在 Unix 和 Linux 文件系统中,每个目录都包含两个特殊的条目:.
和 ..
。.
代表目录本身,..
代表父目录。这两个条目都被计入目录的链接数。因此,一个没有子目录的新目录的链接数为 2。
当你使用 ls -l
命令查看目录或文件的详细信息时,第二列就是链接数。例如:
drwxr-xr-x 2 user user 4096 May 30 16:34 directory
-rw-r--r-- 1 user user 1024 May 30 16:34 file
在这个例子中,directory
的链接数为 2,file
的链接数为 1。
1.3 Linux 显示的时间位置是代表的是最后修改的时间还是创建的时间?
在 Linux 系统中,当你使用 ls -l
命令查看文件或目录的详细信息时,时间戳字段默认显示的是最后一次修改的时间,也被称为修改时间 (mtime
)。
不过在 Linux 中,还有两个其他的时间戳可以参考:
- 访问时间 (
atime
):文件最后一次被读取的时间。 - 状态改变时间 (
ctime
):文件状态最后一次改变的时间,比如权限或者所有者的改变。
注意,Linux 并不直接支持显示文件的创建时间,这是由于大多数 Linux 文件系统并不存储这个信息。这一点与一些其他的操作系统,如 Windows 和 Mac OS X,不同,这些系统会直接显示文件的创建时间。
如果你想查看这些额外的时间戳,可以使用 stat
命令。例如,stat filename
将会显示文件的访问时间、修改时间以及状态改变时间。
不过请注意,根据你的 Linux 发行版和文件系统,可用的信息可能会有所不同。
公众号:AI悦创【二维码】
AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
- 0
- 0
- 0
- 0
- 0
- 0