linux下的wc命令的源代码
linux-实验指导手册-常用命令
实验一Linux常用命令(一)1、Shell环境和Shell命令格式如果实验用计算机上Linux以图形方式启动,登录系统后打开终端窗口。
方法:桌面:右键菜单-Terminal(终端);或:主菜单-系统工具-Terminal(终端)。
命令格式:command [-option(s)] [option argument(s)] [command argument(s)]步骤1:使用who命令步骤2:使用date命令步骤3:使用上下健提取历史命令who,执行。
2、文件系统操作命令(1)改变目录命令:cd 目标目录路径步骤1:使用绝对路径依次进入Linux根目录下的所有子目录。
例如:cd /usr/bin步骤2:使用绝对路径依次进入用户目录。
步骤3:使用相对路径进入子目录1)使用绝对路径进入/lib目录2)使用相对路径进入/lib/i868目录3)使用相对路径退回到/lib目录(2)列出并观察目录中的文件步骤1:进入任意目录,使用无参数ls命令列出并观察其中所有文件;步骤2:进入任意目录,使用通配符列出其中部分文件;例如:cd /binls c*步骤3:使用-l选项,列出目录中文件的各种属性,并观察识别这些属性。
步骤4:直接列出子目录中的文件。
例如:ls i868步骤5:仅列出子目录本身(-d)步骤6:使用-F选项,显示文件类型标志。
步骤7:使用-a或-A选项,观察结果有什么变化。
步骤8:综合使用以上选项。
(3)目录的创建与删除步骤1:在用户目录中,使用相对路径创建一个任意名称的目录,如“tmp”。
mkdir tmp步骤2:删除该目录rmdir tmp步骤3:在根目录中,使用绝对路径在用户命令中创建一个子目录。
mkdir ~/tmp步骤4:删除该目录rmdir ~/tmp步骤5:使用-p参数一次创建多级目录。
如:mkdir ~/tmp/dir1步骤6:使用-p参数删除多级目录。
如:cd ~rmdir tmp/dir1(4)文件和目录拷贝命令:cp步骤1:从/usr/include目录中,任选一个文件拷贝到用户目录的tmp子目录中mkdir ~/tmpcp /usr/include/signal.h ~/tmp步骤2:从/usr/include目录中,任选一个文件拷贝到用户目录的tmp子目录中,并改变其文件名。
linux gcc编译win32程序
linux gcc编译win32程序如何通过Linux GCC编译Win32程序在跨平台开发中,有时候我们可能需要在Linux操作系统上编译Windows 平台的程序。
虽然Windows和Linux是两种截然不同的操作系统,但是通过使用GCC编译器和一些工具,我们仍然可以完成这个任务。
在本文中,我将向您展示一步一步使用Linux GCC编译Win32程序的过程。
请按照以下步骤进行操作。
步骤1:安装GCC编译器首先,确保您的Linux系统中已经安装了GCC编译器。
如果没有安装,可以通过以下命令在终端中进行安装:shellsudo apt-get install build-essential这条命令将会安装GCC编译器以及相关的开发工具。
步骤2:安装MinGW工具链MinGW是一个在Windows上运行的开发工具链集合,可以用来编译Windows平台的可执行文件。
我们将在Linux上使用MinGW工具链来编译Windows程序。
您可以通过以下命令在终端中进行安装:shellsudo apt-get install mingw-w64这条命令将会安装MinGW工具链。
步骤3:创建Win32交叉编译环境现在,我们需要为GCC编译器创建一个Win32交叉编译环境。
在终端中运行以下命令:shellsudo update-alternatives config x86_64-w64-mingw32-gcc该命令将显示一个列表,列出了可用的编译器版本。
选择与您的系统架构相对应的gcc版本。
按照提示进行选择。
步骤4:编写Win32程序在准备好编译环境后,我们可以开始编写Win32程序。
创建一个C语言源文件,比如"hello.c",并输入以下代码:c#include <windows.h>#include <stdio.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCEhPrevInstance, LPSTR lpCmdLine, int nCmdShow) {MessageBoxA(NULL, "Hello World!", "Hello", MB_OK);return 0;}这是一个简单的Win32程序,用于显示一个消息框。
一天一个shell命令linux文本操作系列-wc命令详解
⼀天⼀个shell命令linux⽂本操作系列-wc命令详解
全称
wc是⼀个⽤于统计的⼯具,全拼为:Word Count(单词统计)
实例:
1. 统计⾏数
$wc –l file
2. 统计单词数
$wc –w file
3. 统计字符数
$wc –c file
4. 统计流中的字符数
$echo –n 1234 | wc –c
输出:4
解读--help
⽤法:wc [选项]... [⽂件]...
或:wc [选项]... --files0-from=F
打印每⾏的换⾏符,单词,字节的数量,如果多于⼀个⽂件,则打印每个总⾏数。
如果没有⽂件,或者⽂件位置⽤“-”表⽰,则读取标准流。
⼀个单词是由空⽩符分隔的⾮零长的字符序列下⾯的操作可能⽤于选择某种类型数量的打印,通常顺序是换⾏符,单词,字符,字节,最⼤⾏的长度
-c, --bytes 打印字节数
-m, --chars 打印字符数
-l, --lines 打印换⾏符,即总⾏数
--files0-from=⽂件从指定⽂件读取以NUL 终⽌的名称,如果该⽂件被
指定为"-"则从标准输⼊读⽂件名
-L, --max-line-length 显⽰最长⾏的长度
-w, --words 显⽰单词计数
--help 显⽰此帮助信息并退出
--version 显⽰版本信息并退出
解读:
1. 多于⼀个⽂件
$wc file1 file2
打印两个⽂件的分别的统计⾏数
2. –L
打印最长的⾏数的字符数,即长度
3. 直接wc ⽂件,⽆任何参数
顺序是⾏数,单词,字符,字节,最⼤⾏长度。
Linux命令高级技巧使用xargs命令进行命令参数的灵活处理和传递
Linux命令高级技巧使用xargs命令进行命令参数的灵活处理和传递Linux命令高级技巧:使用xargs命令进行命令参数的灵活处理和传递Linux是一种自由和开放源代码的类Unix操作系统,广泛应用于服务器领域。
在Linux中,命令行是基本操作方式之一,灵活运用各种命令可以提高工作效率。
本文将介绍Linux命令高级技巧之一:使用xargs命令进行命令参数的灵活处理和传递。
一、xargs命令简介xargs命令是一个强大的命令,可以将标准输入的数据转换为命令行参数,实现对命令参数的灵活处理和传递。
它通常与其他命令(如grep、find等)配合使用,能够处理大量的参数,提高命令的执行效率。
二、基本使用方法xargs命令的基本使用方法如下:```command | xargs [options] [command]```其中,command代表要执行的命令,可以是任意的Linux命令。
options是一些可选参数,可以用于调整xargs命令的行为。
[command]是可选的,如果不指定,则默认为echo命令。
三、参数处理示例以下是一些使用xargs命令进行参数处理的示例:1. 使用xargs命令传递参数假设我们有一个文件列表filelist.txt,里面包含了一些文件名,每行一个文件。
我们可以使用xargs命令将这些文件名作为参数传递给另一个命令进行处理。
例如,我们可以使用xargs命令将这些文件复制到指定目录:```cat filelist.txt | xargs -I {} cp {} /path/to/destination/```其中,-I {}表示将每行的文件名替换成{},然后将替换后的参数传递给cp命令进行处理。
2. 使用xargs命令处理find命令的输出find命令用于在文件系统中搜索文件和目录。
假设我们希望在当前目录及其子目录中找到所有后缀名为.txt的文件,并统计它们的行数。
我们可以将find命令的输出通过管道传递给xargs命令,并使用wc命令统计行数:```find ./ -type f -name "*.txt" | xargs wc -l```以上命令将在当前目录及其子目录中搜索后缀名为.txt的文件,并统计它们的行数。
渗透利器(第一章-2)kalilinux基础命令讲解介绍
渗透利器(第⼀章-2)kalilinux基础命令讲解介绍认识Linux什么是shellshell与终端的区别Linux常⽤命令Linux中⽂件与⽬录的权限什么是shell在计算机科学中,shell俗称外壳(⽤来区别于内核),它类似于windows的dos,能够接收⽤户的命令并翻译给操作系统执⾏,是⽤户与操作系统(内核)之间的桥梁查看shell查看系统⽀持那些shellcat/etc/shells查看正在使⽤的shellecho $SHELLshell与终端的区别终端:接受⽤户的输⼊,并传递给shell程序,接受程序输出并展⽰到屏幕shell:接受并解析⽤户的命令给操作系统执⾏,将结果输出到终端使⽤vim编辑器VM编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本⼀样,它的强⼤不逊⾊于任何最新的⽂本编辑器。
他是我们使⽤Linux系统不能缺少的⼯具。
vim具有程序编辑的能⼒,可以以字体颜⾊辨别语法的正确性,⽅便程序设计;vim可以当作vi的升级版本,他可以⽤多种颜⾊的⽅式来显⽰⼀些特殊的信息。
vim会依据⽂件扩展名或者是⽂件内的开头信息,判断该⽂件的内容⽽⾃动的执⾏该程序的语法判断式,再以颜⾊来显⽰程序代码与⼀般信息。
vim⾥⾯加⼊了很多额外的功能,例如⽀持正则表达式的搜索、多⽂件编辑、块复制等等。
这对于我们在Linux上进⾏⼀些配置⽂件的修改⼯作时是很棒的功能。
vi/vim编辑器模式命令模式(默认):刚进⼊vim的时候,默认就是命令模式,可以复制⾏,删除⾏等。
输⼊模式- +命令模式 ESC键输⼊模式:可以输⼊内容。
关闭、保存⽂件模式转换 shift键+:号使⽤insert键切换进⼊输⼊模式命令模式下:命令模式-→输⼊模式:W:保存.i:在当前光标所在字符的前⾯,转为输⼊模式 q:退出I:在当前光标所在⾏的⾏⾸转换为输⼊模式 wq和x都是保存退出a:在当前光标所在字符的后⾯,转为输⼊模式 q! :强制退出A:在光标所在⾏的⾏尾,转换为输⼊模式 w! :强制保存,管理员才有权限o:在当前光标所在⾏的下⽅,新建⼀⾏,并转为输⼊模式0:在当前光标所在⾏的上⽅,新建-⾏,并转为输⼊模式查找s:删除光标所在字符普通模式:r:替换光标处字符 /PATTERN:从当前位置向后查找PATTERN: 从当前位置向前查找date命令date命令⽤于显⽰及设置系统的时间或⽇期,格式为“date [选项] [+指定的格式]”。
curl linux编译
curl linux编译curl是一个非常流行的开源网络库,它支持多种协议(如HTTP、FTP、SMTP等)和常见的加密方式(如SSL、TLS等),并提供易于使用的命令行工具,用于在Linux系统上进行网络通信。
下面是关于在Linux上编译curl的指南。
1. 下载curl源代码首先,你需要从curl官方网站下载源代码。
你可以使用以下命令:$ wget https://curl.se/download/curl-7.79.1.tar.gz 这个命令将从curl官方网站下载curl-7.79.1版本的源代码,并将其保存为curl-7.79.1.tar.gz文件。
2. 解压缩源代码下载完成后,你需要解压缩源代码。
你可以使用以下命令:$ tar -xzvf curl-7.79.1.tar.gz这个命令将解压缩curl-7.79.1.tar.gz文件,并将源代码保存在一个名为curl-7.79.1的目录中。
3. 配置编译选项接下来,你需要配置curl的编译选项。
你可以使用以下命令: $ cd curl-7.79.1$ ./configure这个命令将执行一个脚本,用于检查你的系统并确定最佳的编译选项。
如果一切正常,你将看到一个类似下面的输出:......configure: Configured to build curl/libcurl:configure: CC: gccconfigure: CFLAGS: -g -O2 -Wdeclaration-after-statement configure: CPPFLAGS:configure: LD: gccconfigure: LDFLAGS:注意,你可能需要在configure命令中添加一些选项,以适应你的特定需求。
你可以查看configure的帮助文档,以获取更多信息:$ ./configure --help4. 编译和安装完成配置后,你可以开始编译curl。
linuxgcc命令及用法
linuxgcc命令及用法Linux的gcc命令是一款非常强大的编译器,用于将源代码转换为可执行文件。
本文将详细介绍gcc命令及其常用的用法,帮助读者更好地理解和使用这款工具。
一、gcc命令的基本语法结构gcc是GNU Compiler Collection(GNU编译器集合)的简称,因此其命令基本语法结构一般为:shellgcc [选项] [输入文件]其中,选项用于指定编译时的相关参数,输入文件则是需要编译的源文件。
二、gcc命令的常用选项gcc命令提供了许多选项,用于控制编译过程及生成的可执行文件的属性。
下面是一些常用的gcc选项及其作用:1. -o:用于指定输出文件的名称。
例如,使用`-o myprogram`选项将输出文件命名为myprogram。
2. -c:仅进行编译,不进行链接操作。
这个选项常用于编译多个源文件时,先将每个源文件编译为目标文件,再进行链接操作。
3. -g:生成调试信息。
这个选项会在编译时生成与调试器兼容的调试信息,方便开发人员进行程序调试。
4. -Wall:显示所有警告信息。
使用这个选项可以使编译器在编译时输出更多的警告信息,帮助开发人员提前发现潜在的问题。
5. -I:指定头文件的搜索路径。
使用这个选项可以告诉编译器在指定的路径中查找头文件,方便引用外部库、模块等。
6. -L:指定库文件的搜索路径。
与-I选项类似,这个选项用于告诉编译器在指定的路径中查找库文件,用于链接时的库文件搜索。
7. -l:指定要链接的库文件。
使用这个选项可以显式地告诉编译器要链接的库文件,如:-lmath将链接math库文件。
三、gcc命令的应用实例下面通过几个实例来演示gcc命令的具体用法,以帮助读者更好地理解和掌握这款工具。
1. 编译单个源文件并生成可执行文件假设我们有一个名为`hello.c`的源文件,内容如下:c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}我们可以使用以下命令将其编译为可执行文件`hello`:shellgcc -o hello hello.c编译成功后,即可在当前目录下生成名为`hello`的可执行文件。
linux中日志文件查找,根据关键字,vi命令,awk和wc
linux中⽇志⽂件查找,根据关键字,vi命令,awk和wc当时需求:查看系统⽇志,统计系统的处理时间(从请求进去系统到系统返回)⽇志⽂件: 1.log开始处理:1. 将⽇志中的关键⾏(初始、结束、关键节点)打印出来/输出到⽂件(后添加:>2.log): cat 1.log | grep key //根据关键字输出 cat 1.log | egrep '(start handle)+|(end handle)+' //根据两个关键字如果不能⼀次查找出来(线程数较多),可以先输出到⽂件,再重复根据线程名查找⼀次。
grep最常⽤的分组,egrep可以使⽤更多的正则符号,fgrep可以认为就是不使⽤正则字符(应该可以这么理解,原⽂:正则表达式中的元字符表⽰回其⾃⾝的字⾯意义,不再特殊)。
cat 1.log | grep key 可以写为: grep key 1.log ,同理。
awk和wc命令ps -ef | grep java | awk '{print $2}' : 可以显⽰出所有Java进程的pid,awk中可以默认使⽤空⽩分隔符,可以使⽤awk -F,指定分隔符,其中$2就是分割后输出第⼆个字符串,ps -ef | grep java | awk '{print $2}' | wc -l : 可以统计当前⼀共有多少Java进程wc中-c 统计字节数,-l 统计⾏数,-m 统计字符数,这个标志不能与 -c 标志⼀起使⽤,-w 统计字数。
⼀个字被定义为由空⽩、跳格或换⾏字符分隔的字符串。
-L 打印最长⾏的长度。
VI中//以下删除命令好多都是剪贴,删除应该就是剪贴吧。
Ctrl+u:向⽂件⾸翻半屏;Ctrl+d:向⽂件尾翻半屏;Ctrl+f:向⽂件尾翻⼀屏;Ctrl+b:向⽂件⾸翻⼀屏;Esc:从编辑模式切换到命令模式;ZZ:命令模式下保存当前⽂件所做的修改后退出vi;:⾏号:光标跳转到指定⾏的⾏⾸;:$:光标跳转到最后⼀⾏的⾏⾸;x或X:删除⼀个字符,x删除光标后的,⽽X删除光标前的;D:删除从当前光标到光标所在⾏尾的全部字符;dd:删除光标⾏正⾏内容;ndd:删除当前⾏及其后n-1⾏;nyy:将当前⾏及其下n⾏的内容保存到寄存器?中,其中?为⼀个字母,n为⼀个数字;p:粘贴⽂本操作,⽤于将缓存区的内容粘贴到当前光标所在位置的下⽅;P:粘贴⽂本操作,⽤于将缓存区的内容粘贴到当前光标所在位置的上⽅;/字符串:⽂本查找操作,⽤于从当前光标所在位置开始向⽂件尾部查找指定字符串的内容,查找的字符串会被加亮显⽰;name:⽂本查找操作,⽤于从当前光标所在位置开始向⽂件头部查找指定字符串的内容,查找的字符串会被加亮显⽰;a,bs/F/T:替换⽂本操作,⽤于在第a⾏到第b⾏之间,将F字符串换成T字符串。
linux c语言好玩的代码
linux c语言好玩的代码Linux操作系统下的C语言编程提供了许多有趣的代码实现,让程序员们可以在编写代码的过程中获得乐趣与挑战。
本文将介绍一些有趣的Linux C语言代码示例,帮助读者更好地理解和掌握这些代码的实现原理。
一、彩色输出文本在Linux终端中,我们可以使用ANSI转义序列来实现彩色输出文本。
通过在输出文本前插入相应的转义序列,可以改变文本的颜色、背景色和样式。
下面是一个简单的示例代码,实现了在终端中输出彩色的 "Hello World!" 文本。
```c#include <stdio.h>#define COLOR_RED "\x1b[31m"#define COLOR_GREEN "\x1b[32m"#define COLOR_YELLOW "\x1b[33m"#define COLOR_BLUE "\x1b[34m"#define COLOR_MAGENTA "\x1b[35m"#define COLOR_CYAN "\x1b[36m"#define COLOR_RESET "\x1b[0m"int main() {printf(COLOR_RED "Hello " COLOR_GREEN "World!" COLOR_RESET "\n");return 0;}```在这段代码中,我们使用了一些预定义的ANSI转义序列来定义不同的颜色。
通过在输出文本前插入相应的转义序列,可以改变输出文本的颜色。
通过这种方式,我们可以在终端中实现彩色的输出效果。
二、生成随机数在C语言中,我们可以使用rand()函数生成一个伪随机数序列。
下面是一个简单的示例代码,实现了生成一个1到100之间的随机数。
Linux0.01内核源代码及注释
Bootsect.s(1-9)!! SYS_SIZE is the number of clicks (16 bytes) to be loaded.! 0x3000 is 0x30000 bytes = 196kB, more than enough for current! versions of linux ! SYS_SIZE 是要加载的节数(16 字节为1 节)。
0x3000 共为1 2 3 4 5 60x7c000x00000x900000x100000xA0000system 模块代码执行位置线路0x90200! 0x30000 字节=192 kB(上面Linus 估算错了),对于当前的版本空间已足够了。
!SYSSIZE = 0x3000 ! 指编译连接后system 模块的大小。
参见列表1.2 中第92 的说明。
! 这里给出了一个最大默认值。
!! bootsect.s (C) 1991 Linus Torvalds!! bootsect.s is loaded at 0x7c00 by the bios-startup routines, and moves! iself out of the way to address 0x90000, and jumps there.!! It then loads 'setup' directly after itself (0x90200), and the system! at 0x10000, using BIOS interrupts.!! NOTE! currently system is at most 8*65536 bytes long. This should be no! problem, even in the future. I want to keep it simple. This 512 kB! kernel size should be enough, especially as this doesn't contain the! buffer cache as in minix!! The loader has been made as simple as possible, and continuos! read errors will result in a unbreakable loop. Reboot by hand. It! loads pretty fast by getting whole sectors at a time whenever possible.!! 以下是前面这些文字的翻译:! bootsect.s (C) 1991 Linus Torvalds 版权所有!! bootsect.s 被bios-启动子程序加载至0x7c00 (31k)处,并将自己! 移到了地址0x90000 (576k)处,并跳转至那里。
noi linux常用指令
在Linux中,有很多常用的命令。
这里列举了一些常见的命令:1. `ls`:列出当前目录中的文件和文件夹。
2. `cd`:切换当前工作目录。
3. `mkdir`:创建一个新的文件夹。
4. `rm`:删除一个文件或文件夹。
5. `cp`:复制一个文件或文件夹。
6. `mv`:移动或重命名一个文件或文件夹。
7. `cat`:查看文件的内容。
8. `more`:查看文件的内容,一页一页地显示。
9. `less`:查看文件的内容,可以通过上下键翻页。
10. `vi`:编辑文件。
11. `grep`:搜索文件中的指定字符串。
12. `find`:查找指定文件或文件夹。
13. `uptime`:显示系统已运行的时间。
14. `top`:显示当前系统的进程状态。
15. `df`:显示当前系统的磁盘使用情况。
16. `kill`:杀死一个进程。
17. `pwd`:显示当前工作目录的路径。
18. `tree`:以树状图的方式显示目录结构。
19. `whoami`:显示当前用户的信息。
20. `touch`:创建空文件或更新文件时间戳。
21. `stat`:显示文件或文件系统状态。
22. `man`:查看命令的手册页。
23. `head`:显示文件的开头部分内容。
24. `tail`:显示文件的结尾部分内容。
25. `date`:显示或设置系统日期和时间。
26. `cal`:显示日历。
27. `which`:查找并显示可执行文件的路径。
28. `alias`:创建命令的别名。
29. `whereis`:查找可执行文件、源代码和手册页的位置。
30. `sort`:对文本行进行排序。
31. `uniq`:报告或省略重复的行。
32. `zip`和`unzip`:压缩和解压缩文件。
33. `tar`:打包和解包文件和目录。
34. `bc`:计算器语言和程序。
35. `uname`:显示系统信息。
36. `shutdown`, `poweroff`, `halt`: 关闭或重启计算机。
linux查看系统资源命令
linux查看系统资源命令lsof -n | grep loglsof -p 进程id 能看到这个进程加载了哪些资源,连接了哪些⽂件,⾃⼰⽹络链接虽然平时⼤部分⼯作都是和Java相关的开发, 但是每天都会接触Linux系统, 尤其是使⽤了Mac之后, 每天都是⼯作在⿊⾊背景的命令⾏环境中. ⾃⼰记忆⼒不好, 很多有⽤的Linux命令不能很好的记忆, 现在逐渐总结⼀下, 以便后续查看.基本操作Linux关机,重启# 关机shutdown -h now# 重启shutdown -r now查看系统,CPU信息# 查看系统内核信息uname -a# 查看系统内核版本cat /proc/version# 查看当前⽤户环境变量envcat /proc/cpuinfo# 查看有⼏个逻辑cpu, 包括cpu型号cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c# 查看有⼏颗cpu,每颗分别是⼏核cat /proc/cpuinfo | grep physical | uniq -c# 查看当前CPU运⾏在32bit还是64bit模式下, 如果是运⾏在32bit下也不代表CPU不⽀持64bitgetconf LONG_BIT# 结果⼤于0, 说明⽀持64bit计算. lm指long mode, ⽀持lm则是64bitcat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l建⽴软连接ln -s /usr/local/jdk1.8/ jdkrpm相关# 查看是否通过rpm安装了该软件rpm -qa | grep 软件名sshkey# 创建sshkeyssh-keygen -t rsa -C your_email@#id_rsa.pub 的内容拷贝到要控制的服务器的 home/username/.ssh/authorized_keys 中,如果没有则新建(.ssh权限为700, authorized_keys权限为600)命令重命名# 在各个⽤户的.bash_profile中添加重命名配置alias ll='ls -alF'同步服务器时间sudo ntpdate -u ntp.api.bz后台运⾏命令# 后台运⾏,并且有nohup.out输出nohup xxx &# 后台运⾏, 不输出任何⽇志nohup xxx > /dev/null &# 后台运⾏, 并将错误信息做标准输出到⽇志中nohup xxx >out.log 2>&1 &强制活动⽤户退出# 命令来完成强制活动⽤户退出.其中TTY表⽰终端名称pkill -kill -t [TTY]查看命令路径which <命令>查看进程所有打开最⼤fd数ulimit -n配置dnsvim /etc/resolv.confnslookup,查看域名路由表nslookup last, 最近登录信息列表# 最近登录的5个账号last -n 5设置固定ipifconfig em1 192.168.5.177 netmask 255.255.255.0查看进程内加载的环境变量# 也可以去 cd /proc ⽬录下, 查看进程内存中加载的东西ps eww -p XXXXX(进程号)查看进程树找到服务器进程ps auwxf查看进程启动路径cd /proc/xxx(进程号)ls -all# cwd对应的是启动路径添加⽤户, 配置sudo权限# 新增⽤户useradd ⽤户名passwd ⽤户名#增加sudo权限vim /etc/sudoers# 修改⽂件⾥⾯的# root ALL=(ALL) ALL# ⽤户名 ALL=(ALL) ALL强制关闭进程名包含xxx的所有进程ps aux|grep xxx | grep -v grep | awk '{print $2}' | xargs kill -9磁盘,⽂件,⽬录相关操作vim操作#normal模式下 g表⽰全局, x表⽰查找的内容, y表⽰替换后的内容:%s/x/y/g#normal模式下0 # 光标移到⾏⾸(数字0)$ # 光标移⾄⾏尾shift + g # 跳到⽂件最后gg # 跳到⽂件头# 显⽰⾏号:set nu# 去除⾏号:set nonu# 检索/xxx(检索内容) # 从头检索, 按n查找下⼀个xxx(检索内容) # 从尾部检索打开只读⽂件,修改后需要保存时(不⽤切换⽤户即可保存的⽅式) # 在normal模式下:w !sudo tee %查看磁盘, ⽂件⽬录基本信息# 查看磁盘挂载情况mount# 查看磁盘分区信息df# 查看⽬录及⼦⽬录⼤⼩du -H -h# 查看当前⽬录下各个⽂件, ⽂件夹占了多少空间, 不会递归du -sh *wc命令# 查看⽂件⾥有多少⾏wc -l filename# 看⽂件⾥有多少个wordwc -w filename# ⽂件⾥最长的那⼀⾏是多少个字wc -L filename# 统计字节数wc -c常⽤压缩, 解压缩命令压缩命令tar czvf xxx.tar 压缩⽬录zip -r xxx.zip 压缩⽬录解压缩命令tar zxvf xxx.tar# 解压到指定⽂件夹tar zxvf xxx.tar -C /xxx/yyy/unzip xxx.zip变更⽂件所属⽤户, ⽤户组chown eagleye.eagleye xxx.logcp, scp, mkdir#复制cp xxx.log# 复制并强制覆盖同名⽂件cp -f xxx.log# 复制⽂件夹cp -r xxx(源⽂件夹) yyy(⽬标⽂件夹)# 远程复制scp -P ssh端⼝ username@10.10.10.101:/home/username/xxx /home/xxx# 级联创建⽬录mkdir -p /xxx/yyy/zzz# 批量创建⽂件夹, 会在test,main下都创建java, resources⽂件夹mkdir -p src/{test,main}/{java,resources}⽐较两个⽂件diff -u 1.txt 2.txt⽇志输出的字节数,可以⽤作性能测试# 如果做性能测试, 可以每执⾏⼀次, 往⽇志⾥⾯输出 “.” , 这样⽇志中的字节数就是实际的性能测试运⾏的次数, 还可以看见实时速率. tail -f xxx.log | pv -bt查看, 去除特殊字符# 查看特殊字符cat -v xxx.sh# 去除特殊字符sed -i 's/^M//g’ env.sh 去除⽂件的特殊字符, ⽐如^M: 需要这样输⼊: ctrl+v+enter处理因系统原因引起的⽂件中特殊字符的问题# 可以转换为该系统下的⽂件格式cat file.sh > file.sh_bak# 先将file.sh中⽂件内容复制下来然后运⾏, 然后粘贴内容, 最后ctrl + d 保存退出cat > file1.sh# 在vim中通过如下设置⽂件编码和⽂件格式:set fileencodings=utf-8 ,然后 w (存盘)⼀下即可转化为 utf8 格式,:set fileformat=unix# 在mac下使⽤dos2unix进⾏⽂件格式化find . -name "*.sh" | xargs dos2unixtee, 重定向的同时输出到屏幕awk ‘{print $0}’ xxx.log | tee test.log检索相关grep# 反向匹配, 查找不包含xxx的内容grep -v xxx# 排除所有空⾏grep -v '^/pre># 返回结果 2,则说明第⼆⾏是空⾏grep -n “^$” 111.txt# 查询以abc开头的⾏grep -n “^abc” 111.txt# 同时列出该词语出现在⽂章的第⼏⾏grep 'xxx' -n xxx.log# 计算⼀下该字串出现的次数grep 'xxx' -c xxx.log# ⽐对的时候,不计较⼤⼩写的不同grep 'xxx' -i xxx.logawk# 以':' 为分隔符,如果第五域有user则输出该⾏awk -F ':' '{if ($5 ~ /user/) print $0}' /etc/passwd# 统计单个⽂件中某个字符(串)(中⽂⽆效)出现的次数awk -v RS='character' 'END {print --NR}' xxx.txtfind检索命令# 在⽬录下找后缀是.mysql的⽂件find /home/eagleye -name '*.mysql' -print# 会从 /usr ⽬录开始往下找,找最近3天之内存取过的⽂件。
在linux下实现读者写者问题源代码
在linux下实现读者写者问题源代码读者写者问题是计算机科学中的一个经典同步问题,用于描述多个读者和写者对共享资源的访问。
在这个问题中,多个读者可以同时读取共享资源,但是写者在写入共享资源时必须独占访问。
在Linux下,我们可以使用线程和互斥锁来实现读者写者问题。
下面是一个简单的源代码示例:```c#include <stdio.h>#include <stdlib.h>#include <pthread.h>#define READERS_COUNT 5#define WRITERS_COUNT 2pthread_mutex_t mutex;pthread_cond_t cond_reader, cond_writer;int readers = 0;int writers = 0;void *reader(void *arg) {int id = *(int *)arg;while (1) {pthread_mutex_lock(&mutex);while (writers > 0) {pthread_cond_wait(&cond_reader, &mutex); }readers++;pthread_mutex_unlock(&mutex);// 读取共享资源printf("Reader %d is reading\n", id);pthread_mutex_lock(&mutex);readers--;if (readers == 0) {pthread_cond_signal(&cond_writer);}pthread_mutex_unlock(&mutex);}pthread_exit(NULL);}void *writer(void *arg) {int id = *(int *)arg;while (1) {pthread_mutex_lock(&mutex);while (readers > 0 || writers > 0) {pthread_cond_wait(&cond_writer, &mutex); }writers++;pthread_mutex_unlock(&mutex);// 写入共享资源printf("Writer %d is writing\n", id);pthread_mutex_lock(&mutex);writers--;pthread_cond_signal(&cond_writer);pthread_cond_broadcast(&cond_reader);pthread_mutex_unlock(&mutex);}pthread_exit(NULL);}int main() {pthread_t readers[READERS_COUNT];pthread_t writers[WRITERS_COUNT];int reader_ids[READERS_COUNT];int writer_ids[WRITERS_COUNT];pthread_mutex_init(&mutex, NULL);pthread_cond_init(&cond_reader, NULL);pthread_cond_init(&cond_writer, NULL);// 创建读者线程for (int i = 0; i < READERS_COUNT; i++) {reader_ids[i] = i + 1;pthread_create(&readers[i], NULL, reader, &reader_ids[i]); }// 创建写者线程for (int i = 0; i < WRITERS_COUNT; i++) {writer_ids[i] = i + 1;pthread_create(&writers[i], NULL, writer, &writer_ids[i]); }// 等待线程结束for (int i = 0; i < READERS_COUNT; i++) {pthread_join(readers[i], NULL);}for (int i = 0; i < WRITERS_COUNT; i++) {pthread_join(writers[i], NULL);}pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond_reader);pthread_cond_destroy(&cond_writer);return 0;}```在这个源代码中,我们使用了互斥锁(`pthread_mutex_t`)和条件变量(`pthread_cond_t`)来实现读者写者问题的同步。
Linux常用命令 个人整理
第1章Linux目录结构Linux命令是严格区分大小写的ls 显示指定目录下的列表No 命令/参数作用1 ls 后面不带参数显示当前目录下的列表2 ls /bin 显示bin目录下的所有列表3 ls –l 显示当前目录下文件的详细信息(长格式输出)4 ls /bin –l 显示bin目录下文件的详细信息5 ls -a 显示所有文件,在linux中文件名以“.”开头表示隐藏文件6 ls –a -l 显示当前目录下文件的所有信息,这个命令可简写为“ls -al”或“ls -la”7 ls -i 显示文件的索引节点号,如果两个文件的索引节点号相同则内容一样8 Ls -hl 显示当前目录下文件的详细信息(长格式输出) 并且显示文件大小Linux中文件的前缀表示的含义,在Linux中命令是严格区分大小写的chmod 777 test.txt 表示test.txt文件所有用户和组都有权限可读、可写、可执行No 文件类型前缀表示文件的类型或权限1 - 以“-”开头对应的文件是普通文件2 d 以“d”开头表示是目录3 l 以“l”开头表示对应的文件是符号链接4 c 以“c”开头对应的文件是字符设备文件5 b 以“b”开头对应的文件是块设备文件6 蓝色显示表示该文件是目录7 浅蓝色符号链接文件8 默认颜色显示表示是普通文件9 绿色显示表示是可执行程序,或者是可执行文件10 红色显示红色表示压缩文件cd 切换用户的当前工作目录No 命令/参数作用1 cd /bin 切换到bin目录下2 cd 回车后直接回到宿主目录3 cd ~ 回车后直接回到宿主目录4 cd $HOME 回车后直接回到宿主目录5 cd.. 回到上一层目录cp 用于复制(copy)格式:cp 复制的文件名目录/被复制的文件名No 命令/参数作用1 cp install.log Desktop/ 表示将当前文件夹下的install.log文件复制到Desktop目录下不改名2 cp install.log Desktop/new_install.log 表示将当前文件夹下的install.log文件复制到Desktop目录下改名为:new_install.log3 cp anaconda-ks.cfg install.log install.log.syslog Desktop/ 将当前目录下的三个文件复制到mv 文件的移动或改名pwd 显示当前工作目录的绝对路径rm 删除文件或目录[root@localhost ~]#4 rm -r -f test/ 直接删除test文件夹和rm -r f test/的作用一样rmdir 删除空目录No 命令/参数作用1 rmdir mydir 删除mydir目录,只有文件夹为空才能删除2 [root@localhost ~]# rmdir mydir/rmdir: mydir/: 目录非空当文件夹不为空时不能删除3 rmdir -p a/b/c/d/e/f 删除多级空目录chgrp 改变文件所属的工作组No 命令/参数作用1 chgrp shwezh mydir2 改变mydir2的工作组原来所属的工作组:root改变后的工作组:shwezh2 chgrp -R shwezh mydir2/ 将mydir2文件夹下面的所有文件改变为shwezh工作组3 chgrp -R 0 mydir2/ 将mydir2文件夹下面的所有文件改变为root工作组,数字“0”表示root工作组的id好4 groupadd t1 增加t1组5 cat /etc/group 查看系统的组信息6 useradd -g t1 user1 添加user1用户,并把该用户放在t1组里面7 cat /etc/passwd 查看Linux系统中所有用户的信息组的概念chmod 改变文件的权限No 命令/参数作用1 chmod u=rwx,g=rw,o=rw install.log 改变install.log文件的权限2 chmod u-x install.log3 chmod u+x install.log4 chmod a=r install.log 让所有的用户都只有读的权限5 chmod 644 install.logchmod 777 test.txt 表示test.txt文件所有用户和组都有权限可读、可写、可执行小结如何通过chmod去修改某个文件的访问权限①chmod [0-7][0-7][0-7] 文件名②chmod u=rwx,g=rw,o=rx 文件名③chmod u-r,g+x,o-r 文件名chown 改变文件的所有者和所属的工作组No 命令/参数作用1 chown shwezh install.log 改变install.log文件的所有者为shwezh 用户2 chown shwezh:shwezh install.log 同时改变install.log文件的所有者和所属的工作组为shwezh,冒号“:”也可以用点“.”来表示find 在指定目录下查找文件No 命令/参数作用1 find / -name passwd 从根目录开始查找以“passwd”命名的文件2 find /root -name mylinux -exec rm -f {} \; 从root目录开始查找文件名为mylinux文件,找到并删除。
linux常用编译指令
linux常用编译指令Linux是一种开源的操作系统,以其稳定性和安全性而闻名。
在Linux中,编译是一项常见的任务。
编译是将源代码转换为可执行文件的过程,使得我们可以运行和使用软件。
在本文中,我们将介绍一些常用的Linux编译指令,帮助您更好地理解和使用Linux系统。
1. gccgcc是GNU编译器套装(GNU Compiler Collection)的缩写,是Linux系统中最常用的编译器之一。
它支持多种编程语言,如C、C++和Objective-C等。
使用gcc指令可以将源代码编译成可执行文件,例如:```gcc -o hello hello.c```这个指令将hello.c文件编译成一个名为hello的可执行文件。
2. g++g++是gcc的一个版本,专门用于编译C++程序。
与gcc类似,g++可以将C++源代码编译成可执行文件。
例如:```g++ -o hello hello.cpp```这个指令将hello.cpp文件编译成一个名为hello的可执行文件。
3. makemake是一种自动化编译工具,可以根据Makefile文件中的规则来编译源代码。
Makefile是一个包含编译规则的文本文件,其中指定了源文件、目标文件和编译选项等信息。
使用make指令可以根据Makefile文件来编译项目,例如:```make```这个指令将在当前目录中查找Makefile文件,并根据其中的规则来编译源代码。
4. cmakecmake是一个跨平台的编译工具,可以帮助我们生成Makefile文件。
与make相比,cmake更加灵活和方便,可以自动生成适用于不同操作系统和编译器的Makefile文件。
使用cmake指令可以生成Makefile文件,例如:```cmake .```这个指令将在当前目录中生成一个适用于当前系统的Makefile文件。
5. autotoolsautotools是一个用于自动化编译的工具集合,包括autoconf、automake和libtool等工具。
Linux下反汇编分析C语言源代码
Linux下反汇编分析C语⾔源代码Linux下反汇编分析C语⾔源代码by 赵缙翔原创作品转载请注明出处这是我第⼀次写的博客,如有疏漏,还请指教。
在上完孟宁⽼师的软件⼯程课程后,觉得这⽼师的课真⼼不错,就⼜选了他的Linux内核分析。
因为Linux内核代码中还是有⼀些C语⾔没法做的事情需要At&T汇编代码来帮忙,所以我们需要了解⼀些汇编的常识。
汇编基础命名习惯的历史由来最先开始,Intel 8086和8088有⼗四个16位寄存器,⽐如AX, BX, CX, DX等等。
然后Intel出了32位处理器,相对于16位处理器是是扩展的(extended),于是在16位的寄存器基础上加上E前缀,⽐如AX变成了EAX,在后来,AMD出了64位处理器,采⽤的R前缀,具体为什么⽤R,我也不造啊,求告诉。
常⽤的寄存器(有汇编基础的应该很好懂……我学过单⽚机的汇编,竟然也看懂了⼤部分。
so,我就不赘述了,摘抄⾃)Although the main registers (with the exception of the instruction pointer) are "general-purpose" in the 32-bit and 64-bit versions of the instruction set and can be used for anything, it was originally envisioned that they be used for the following purposes: AL/AH/AX/EAX/RAX: AccumulatorBL/BH/BX/EBX/RBX: Base index (for use with arrays)CL/CH/CX/ECX/RCX: Counter (for use with loops and strings)DL/DH/DX/EDX/RDX: Extend the precision of the accumulator (e.g. combine 32-bit EAX and EDX for 64-bit integeroperations in 32-bit code)SI/ESI/RSI: Source index for string operations.DI/EDI/RDI: Destination index for string operations.SP/ESP/RSP: Stack pointer for top address of the stack.BP/EBP/RBP: Stack base pointer for holding the address of the current stack frame.IP/EIP/RIP: Instruction pointer. Holds the program counter, the current instruction address.Segment registers:CS: CodeDS: DataSS: StackES: Extra dataFS: Extra data #2汇编指令由于是我们使⽤的32位的汇编指令,所以有个l前缀,还有,和51单⽚机的堆栈不同,这⾥的堆栈是从⾼向低⼊栈的……还有⼀个问题就摘抄吧,他说得很好AT&T格式和intel格式,这两种格式GCC是都可以⽣成的,如果要⽣成intel格式的汇编代码,只需要加上-masm=intel选项即可,但是Linux下默认是使⽤AT&T格式来书写汇编代码,Linux Kernel代码中也是AT&T格式,我们要慢慢习惯使⽤AT&T格式书写汇编代码。
LINUXCNC源程序原理说明
opLINUXCNC源程序学习源程序的树结构如下:Overview of the emc2 directory (generated by tree -I .git -d) :.|-- app-defaults|-- bin (user mode binaries)|-- configs| |-- 5axis| |-- boss| |-- common| |-- dallur-thc| |-- demo_mazak (sample mazak config files)| |-- demo_sim_cl (sample sim with ladder IO)| |-- demo_step_cl (sample stepper with ladder IO)| |-- etch-servo| |-- halui_halvcp| |-- hexapod-sim| |-- lathe-pluto| |-- m5i20 (sample servo using Mesa PCI)| |-- max| |-- motenc (sample servo using Vital PCI)| |-- nist-lathe| |-- plasma-thc| |-- plasma-thc-sim| |-- ppmc| |-- puma| |-- scara| |-- sim (simulated motion and IO)| |-- stepper (parport stepper driver)| |-- stepper-gantry| |-- stepper-xyza| |-- stg (sample servo using STG ISA)| |-- univpwm (sample PICO servo generator)| |-- univstep (sample PICO stepper generator)| `-- vti|-- debian (files needed to build deb packages)| |-- extras-Ubuntu-5.10 (extra files for Ubuntu 5.10)| | |-- etc| | | |-- modprobe.d| | | |-- udev| | | | |-- rules.d| | | | `-- scripts| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- extras-Ubuntu-6.06 (extra files for building on Ubuntu 6.06 Dapper Drake) | | |-- etc| | | |-- modprobe.d| | | |-- udev| | | | |-- rules.d| | | | `-- scripts| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- extras-Ubuntu-7.10 (extra files for building on Ubuntu 7.10)| | |-- etc| | | |-- modprobe.d| | | |-- udev| | | | `-- rules.d| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- extras-Ubuntu-8.04 (extra files for building on Ubuntu 8.04 Hardy Heron) | | |-- etc| | | |-- modprobe.d| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | `-- share| | |-- applications| | |-- desktop-directories| | `-- pixmaps| |-- extras-sim-Ubuntu-5.10 (extra files for sim package for Ubuntu 5.10)| | |-- etc| | | `-- xdg| | | `-- menus| | | `-- applications-merged| | `-- usr| | |-- desktop-directories| | `-- pixmaps| `-- extras-sim-Ubuntu-6.06 (extra files for sim package for Ubuntu 6.06 Dapper Drake)| |-- etc| | `-- xdg| | `-- menus| | `-- applications-merged| `-- usr| `-- share| |-- applications| |-- desktop-directories| `-- pixmaps|-- docs (All the important and relevant Docs.)| |-- help| |-- html (html version of docs - some generated from lyx)| |-- man (man pages)| | |-- man1| | |-- man3| | `-- man9| `-- src (API and source notes should be in each src dir.) (source for the handbooks) (top level .lyx files) | |-- code| |-- common (shared .lyx files and images, such as glossary, GPLD license)| |-- config| |-- gcode (.lyx files, images, etc. for G-Code documentation)| |-- gui (.lyx files, images, etc. for GUI documentation)| |-- hal (.lyx files, images, etc. for HAL documentation)| |-- install| |-- ladder| |-- motion| `-- quickstart|-- include (headers installed here - originals in src/xxx/)|-- lib (user mode object files)| `-- python| |-- rs274| `-- yapps|-- nc_files (Sample NC files)|-- rtlib (kernel mode object files, only after a successfull compile)|-- scripts(bash scripts like linuxcnc, realtime, rip-environment, etc.)|-- share| |-- axis| | |-- images| | `-- tcl| |-- emc| `-- locale| |-- de| | `-- LC_MESSAGES| |-- es| | `-- LC_MESSAGES| |-- hu| | `-- LC_MESSAGES| |-- it| | `-- LC_MESSAGES| |-- pt_BR| | `-- LC_MESSAGES| |-- ro| | `-- LC_MESSAGES| |-- ru| | `-- LC_MESSAGES| |-- se| | `-- LC_MESSAGES| |-- sr| | `-- LC_MESSAGES| `-- zh_CN| `-- LC_MESSAGES|-- src (source tree - configure script, top level makefile, Makefile.inc, etc)| || |-- depends (generated dependency tree)| || |-- emc (actual LinuxCNC code)| | |-- canterp (interpreter for canonical commands)| | |-- ini (inifile related operations)| | |-- iotask (IO interface, lots of HAL pins)| | |-- kinematics (trajectory planner and kinematics)| | |-- motion (motion controller, talks through SHM to the rest of EMC)| | |-- nml_intf (emc specific NML implementation, all messages sent in emc)| | |-- rs274ngc (the rs274 g-code interpreter)| | |-- sai| | |-- task (core component in emc, dispatches actions to other parts)| | `-- usr_intf (interfaces for some GUIs, and other interfaces: AXIS, halui, stepconf)| | |-- axis| | | |-- etc| | | |-- extensions| | | `-- scripts| | `-- stepconf| |-- hal (the Hardware Abstraction Layer, provides a unified interface across all hardware) | | |-- classicladder| | | `-- projects_examples| | |-- components| | |-- drivers| | | |-- m5i20| | | | |-- bit| | | | `-- hostmot5_src| | | |-- mesa-hostmot2| | | | |-- doc| | | | | `-- SOURCE| | | | `-- 7i43| | | | |-- CPLD| | | | | `-- SOURCE| | | | `-- SOURCE| | | |-- mesa7i43-firmware| | | | |-- gpio| | | | | `-- source| | | | |-- hostmot2| | | | | `-- src| | | | `-- source| | | |-- mesa_5i2x| | | | `-- firmware| | | |-- pluto_servo_firmware| | | `-- pluto_step_firmware| | |-- user_comps| | | |-- devices| | | `-- vcp| | `-- utils| | `-- halgui| |-- libnml (a clean implementation of RCSLIB) | | |-- buffer| | |-- cms| | |-- inifile| | |-- linklist| | |-- nml| | |-- os_intf| | |-- posemath| | `-- rcs| |-- module_helper| |-- objects| | |-- emc| | | |-- canterp| | | |-- ini| | | |-- iotask| | | |-- motion| | | |-- nml_intf| | | |-- rs274ngc| | | |-- sai| | | |-- task| | | `-- usr_intf| | | `-- axis| | | `-- extensions| | |-- hal| | | |-- classicladder| | | |-- components| | | |-- drivers| | | `-- utils| | |-- libnml| | | |-- buffer| | | |-- cms| | | |-- inifile| | | |-- linklist| | | |-- nml| | | |-- os_intf| | | |-- posemath| | | `-- rcs| | |-- rtapi| | |-- rtemc| | | |-- kinematics| | | `-- motion| | |-- rthal| | | |-- classicladder| | | |-- components| | | `-- utils| | |-- rtlibnml| | | `-- posemath| | `-- rtobjects| | `-- hal| | `-- components| |-- po (Translation files for i18n support)| |-- rtapi (*.c and *.h for RTAPI) (unified RT API, wraps over RTLinux, RTAI and sim) | | `-- examples (testing examples for the RTAPI)| | |-- extint| | |-- fifo| | |-- semaphore| | |-- shmem| | `-- timer| `-- tests|-- tcl (tkemc.tcl, mini.tcl - the tcl GUI's)| |-- bin| `-- scripts`-- tests|-- abs.0|-- and-or-not-mux.0|-- basic|-- ccomp| |-- lathe-comp| |-- mill-g90g91g92| |-- mill-line-arc-entry| `-- mill-zchanges|-- counter-encoder.0|-- flipflop.0|-- limit3.0|-- limit3.1|-- limit3.2|-- modparam.0|-- overrun|-- oword| `-- sub.0|-- save.0|-- save.1|-- source.0|-- stepgen.0|-- stepgen.1|-- stepgen.2|-- threads.0`-- timedelay.0Overview of the emc2 install dirs:/ (file system root)|||--- etc/| || \--- init.d/| || \--- realtime (realtime start/stop script)|||--- $(prefix) (default: /usr/local)| | (all the following $xxxxdir are configurable through autoconf | || |--- bin/ (known as $bindir, files from EMC2/bin)| || |--- sbin/ (known as $sbindir, )| || |--- etc/ (known as $sysconfdir, config files and subdirs from configs/) | || |--- lib/ (known as $libdir, lib files *.so from libs/)| || \--- share/| || \--- emc/| || || |--- docs/| || |--- handbooks/| | || | \--- (PDF versions of handbooks)| || \--- nc_files/| || \--- (Sample NC files)||--- $MAN_DIR/ (default: /usr/local/man)| || |--- man1/| | || || || \--- man3/| |||\--- $moduledir/ (based on where ./configure finds the RTOS modules)根据这个结构树,我们可以清楚的知道每一个文件夹,每一个子文件的作用,包括了接口,硬件抽象层,实时内核等等部分。
Linux中sort,uniq,cut,wc命令详解
本文主要对Linux中sort,uniq,cut,wc这4个命令的使用方法进行了详细说明,希望对你有所帮助。
sortsort 命令对File 参数指定的文件中的行排序,并将结果写到标准输出。
如果File 参数指定多个文件,那么sort 命令将这些文件连接起来,并当作一个文件进行排序。
sort语法对/etc/passwd 的账号进行排序sort 是默认以第一个数据来排序,而且默认是以字符串形式来排序,所以由字母a 开始升序排序。
/etc/passwd 内容是以: 来分隔的,我想以第三栏来排序,该如何默认是以字符串来排序的,如果想要使用数字排序:默认是升序排序,如果要倒序排序,如下如果要对/etc/passwd,先以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序。
查看/etc/passwd有多少个shell:对/etc/passwd的第七个域进行排序,然后去重:uniquniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。
也就是说,为了使uniq起作用,所有的重复行必须是相邻的。
uniq语法testfile的内容如下直接删除未经排序的文件,将会发现没有任何行被删除排序文件,默认是去重排序之后删除了重复行,同时在行首位置输出该行重复的次数仅显示存在重复的行,并在行首显示该行重复的次数仅显示不重复的行cutcut命令可以从一个文本文件或者文本流中提取文本列。
cut语法PATH 变量如下将PATH 变量取出,我要找出第五个路径。
将PATH 变量取出,我要找出第三和第五个路径。
将PATH 变量取出,我要找出第三到最后一个路径。
将PATH 变量取出,我要找出第一到第三个路径。
将PATH 变量取出,我要找出第一到第三,还有第五个路径。
实用例子:只显示/etc/passwd的用户和shellwc统计文件里面有多少单词,多少行,多少字符。
wc语法默认使用wc统计/etc/passwd40是行数,45是单词数,1719是字节数wc的命令比较简单使用,每个参数使用如下:。
超级终端常用命令
超等终端经常使用命令!及终端装置软件方法!之答禄夫天创作set interface trust ip 设置防火墙内端口IP地址set interface untrust ip 设置防火墙外端口IP地址set admin sys-ip 设置系统IP地址unset all 清除所有信息打开超等终端:先输入su回车(取得权限出现#号)输入 cd空格/sdcard/(软件所在文件夹的名称),回车。
用PWD 命令可以检查当前目录。
接着输入cp *.apk空格/data/app (*代表文件名) 这个“/data/app”命令就是装置软件到系统。
这样就完成了软件的装置。
SD卡2的文件夹里面,我们只需如下操纵:> $ su > # cd /sdcard/2ls -d --->查找文件夹,如ls -d mail ,功能是查询文件夹mail是否存在2.改变当前路径的命令:cd 具体的路径--->进入指定的路径, 如cd /etccd .. -->进入上一层目录cd / -->进入根目录cd -->进入用户主目录cd - -->返回上一次所在目录3.显示当前所在的目录:pwd4.移动文件到指定的位置:mv 源文件目标路径如mv /home/xyp/*.conf /home/wang-->将xyp目录下的*.conf ,全部移到 wang目录下mv命令,仍具备更改文件名的功能,以及更改目录名功能mv 源文件名目标文件名-->将源文件名更改为指定的新文件名mv 目录名新目录名---->更改文件夹名5.复制文件命令:cp 源文件目标路径如cp /etc/*.conf /home/abc--->复制etc目录下所有*.conf 文件到abc 目录下6.新建文件夹:mkdir 新文件夹名称7.删除文件夹:rmdir 文件夹名称--->只允许删除空文件夹> # cp 1.apk /data/app (注意空格)清屏:clearccs_ceh linux中经常使用的命令一.文件操纵命令:1.查询命令:ls -->查询当前目录下所有的文件及文件夹ls | more --> 分页显示文件及文件夹列表ls -l --> 以列表方式显示文件或文件夹(用户可检查到权限,连接数,用户,组,大小,时间) ll -->功能与ls -l 完全相同l. -->检查隐藏文件8.删除文件:rm 具体文件名--->删除一个文件或多个文件,系统会提示是否要删除文件只有输入y ,才允许删除rm -rf 具体文件名或目录名--->直接删除,无提示9.显示文本文件的内容:cat 文本文件名 --->全部显示10. 分页显示文本文件的内容:more 文本文件名--->分页显示11. 统计文本文件的字符数,行数等wc 文本文件名wc -l 文本文件名--->只统计文本文件的行数12. 在某一个指定文本文件中查询指定的字符串grep 字符串文本文件名如grep network /etc/ntp.conf13. 检查某一个指定文件的详细信息:stat 具体文件名14. 发生空文件:touch 新文件名15. 更改文件或文件夹权限:对象类型:- 普通文件d 文件夹l 链接文件s 网络文件c 字符文件b 块文件权限的代码: 读 4写 2执行 1任何一个文件或文件夹,均由三组权限构成:所有者权限组权限其它用户权限任何一组权限,均由读写执行三个权限组合而成,可以采取编号求和暗示如 3 -> 写执行6 --> 读写5 ---> 读执行7 --->读写执行修改权限的命令:chmod 权限代码文件名或目录名16 .修改文件的所有者以及所属的组:chown 用户名.组名文件名或目录名将组更改为tcchown .tc /home/a.b---> 只改变组chown tc /home/a.c --->只改所有者二.系统中经常使用系统管理命令:1.当前系统中进程查询命令:ps -->当前正在运行的程序[前台]ps -e -->当前正在系统中运行的进程,包含后台进程2.关闭某一个指定的进程:上*海卫*星*电*视装置kill 进程编号3.强行关闭某一个指定的进程:kill -9 进程编号 [强行关闭,针对于失去响应的进程很有效,但同时进程数据也会丢失.]4.关闭指定名称的进程:killall 进程名称5.关闭指定名称的所有进程:killall -9 进程名称6. 将当前正在运行的进程,转到后台运行按ctrl + z7. 检查已转入后台的进程:jobs8 . 将后台进程转入前台fg 后台编号...19. 软件包装置命令:rpm -ivh 软件包装置文件名其中i ->装置v ->状态h ->用 # 暗示进度20. 软件包卸载命令:rpm -e 已装置的软件包名称21. 挂载硬盘命令:[要求支持中文]mount -t vfat -o iocharset=cp936 /dev/hdb3 /mnt/abc22. 显示当前系统中所有的挂载mount三.在字符界面下提高命令使用效率的方法:1.采取上下光标键,使用以前所执行完成的命令:2.采取翻页键,使用以前所执行完成的命令:按下pageup ,可定位到历史命令的第一条3.采取history 命令,查询所使用过的所有命令:借助符号! + history中的命令编号或者是历史命令的前几个字符即可执行对应的命令如!356 -->执行356号命令4.采取tab 键快速输入文件目录名:在输入文件目录名之前,建议先输入一个或几个唯一的字符,再按tab 键5.采取别号提高命令输入的效率:<1>.建立别号:卫星电*视alias 新别号='具体命令'如alias pzqd='vi /boot/gr ub/grub.conf'别号建立后,可直接采取pzqd 暗示原命令,以提高输入效率<2>.别号建立完成后,将保管于内存中.<3>.查询当前系统中所存在的别号alias<4>.设定别号在系统重启后,仍然会存在于系统中只需要将别号添加到/root/.bashrc 文件中即可如alias pzqd='vi/boot/grub/grub.conf' 添加到.bashrc 中<5>. 删除系统中已存在的别号unalias 已存在的别号。
Linux统计行数命令wc(转)
Linux统计⾏数命令wc(转)Linux wc命令⽤于计算字数。
利⽤wc指令我们可以计算⽂件的Byte数、字数、或是列数,若不指定⽂件名称、或是所给予的⽂件名为"-",则wc指令会从标准输⼊设备读取数据。
语法wc [-clw][--help][--version][⽂件...]参数-c或--bytes或--chars 只显⽰Bytes数。
-l或--lines 只显⽰列数。
-w或--words 只显⽰字数。
--help 在线帮助。
--version 显⽰版本信息。
实例在默认的情况下,wc将计算指定⽂件的⾏数、字数,以及字节数。
使⽤的命令为:wc testfile先查看testfile⽂件的内容,可以看到:$ cat testfile#outputLinux networks are becoming more and more common, but scurity is often an overlookedissue. Unfortunately, in today’s environment all networks are potential hacker targets,fro0m tp-secret military research networks to small home LANs.Linux Network Securty focuses on securing Linux in a networked environment, where thesecurity of the entire network needs to be considered rather than just isolated machines.It uses a mix of theory and practicl techniques to teach administrators how to install anduse security applications, as well as how the applcations work and why they are necesary.使⽤wc统计,结果如下:$ wc testfile #testfile⽂件的统计信息#output3 92 598 testfile #testfile⽂件的⾏数为3、单词数92、字节数598其中,3个数字分别表⽰testfile⽂件的⾏数、单词数,以及该⽂件的字节数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* wc - print the number of lines, words, and bytes in filesCopyright (C) 1985, 1991, 1995-2010 Free Software Foundation, Inc.This program is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program. If not, see </licenses/>. */ /* Written by Paul Rubin, phr@and David MacKenzie, djm@. */#include <config.h>#include <stdio.h>#include <assert.h>#include <getopt.h>#include <sys/types.h>#include <wchar.h>#include <wctype.h>#include "system.h"#include "argv-iter.h"#include "error.h"#include "mbchar.h"#include "physmem.h"#include "quote.h"#include "quotearg.h"#include "readtokens0.h"#include "safe-read.h"#include "xfreopen.h"#if !defined iswspace && !HAVE_ISWSPACE# define iswspace(wc) \((wc) == to_uchar (wc) && isspace (to_uchar (wc)))#endif/* The official name of this program (e.g., no `g' prefix). */#define PROGRAM_NAME "wc"#define AUTHORS \proper_name ("Paul Rubin"), \proper_name ("David MacKenzie")/* Size of atomic reads. */#define BUFFER_SIZE (16 * 1024)/* Cumulative number of lines, words, chars and bytes in all files so far.max_line_length is the maximum over all files processed so far. */ static uintmax_t total_lines;static uintmax_t total_words;static uintmax_t total_chars;static uintmax_t total_bytes;static uintmax_t max_line_length;/* Which counts to print. */static bool print_lines, print_words, print_chars, print_bytes;static bool print_linelength;/* The print width of each count. */static int number_width;/* True if we have ever read the standard input. */static bool have_read_stdin;/* The result of calling fstat or stat on a file descriptor or file. */struct fstatus{/* If positive, fstat or stat has not been called yet. Otherwise, this is the value returned from fstat or stat. */int failed;/* If FAILED is zero, this is the file's status. */struct stat st;};/* For long options that have no equivalent short option, use a non-character as a pseudo short option, starting with CHAR_MAX + 1. */ enum{FILES0_FROM_OPTION = CHAR_MAX + 1};static struct option const longopts[] ={{"bytes", no_argument, NULL, 'c'},{"chars", no_argument, NULL, 'm'},{"lines", no_argument, NULL, 'l'},{"words", no_argument, NULL, 'w'},{"files0-from", required_argument, NULL, FILES0_FROM_OPTION}, {"max-line-length", no_argument, NULL, 'L'},{GETOPT_HELP_OPTION_DECL},{GETOPT_VERSION_OPTION_DECL},{NULL, 0, NULL, 0}};voidusage (int status){if (status != EXIT_SUCCESS)fprintf (stderr, _("Try `%s --help' for more information.\n"),program_name);else{printf (_("\Usage: %s [OPTION]... [FILE]...\n\or: %s [OPTION]... --files0-from=F\n\"),program_name, program_name);fputs (_("\Print newline, word, and byte counts for each FILE, and a total line if\n\more than one FILE is specified. With no FILE, or when FILE is -,\n\read standard input.\n\-c, --bytes print the byte counts\n\-m, --chars print the character counts\n\-l, --lines print the newline counts\n\"), stdout);fputs (_("\--files0-from=F read input from the files specified by\n\NUL-terminated names in file F;\n\If F is - then read names from standard input\n\ -L, --max-line-length print the length of the longest line\n\-w, --words print the word counts\n\"), stdout);fputs (HELP_OPTION_DESCRIPTION, stdout);fputs (VERSION_OPTION_DESCRIPTION, stdout);emit_ancillary_info ();}exit (status);}/* FILE is the name of the file (or NULL for standard input)associated with the specified counters. */static voidwrite_counts (uintmax_t lines,uintmax_t words,uintmax_t chars,uintmax_t bytes,uintmax_t linelength,const char *file){static char const format_sp_int[] = " %*s";char const *format_int = format_sp_int + 1;char buf[INT_BUFSIZE_BOUND (uintmax_t)];if (print_lines){printf (format_int, number_width, umaxtostr (lines, buf));format_int = format_sp_int;}if (print_words){printf (format_int, number_width, umaxtostr (words, buf));format_int = format_sp_int;}if (print_chars){printf (format_int, number_width, umaxtostr (chars, buf));format_int = format_sp_int;}if (print_bytes){printf (format_int, number_width, umaxtostr (bytes, buf));format_int = format_sp_int;}if (print_linelength){printf (format_int, number_width, umaxtostr (linelength, buf));}if (file)printf (" %s", file);putchar ('\n');}/* Count words. FILE_X is the name of the file (or NULL for standard input) that is open on descriptor FD. *FSTATUS is its status.Return true if successful. */static boolwc (int fd, char const *file_x, struct fstatus *fstatus){bool ok = true;char buf[BUFFER_SIZE + 1];size_t bytes_read;uintmax_t lines, words, chars, bytes, linelength;bool count_bytes, count_chars, count_complicated;char const *file = file_x ? file_x : _("standard input");lines = words = chars = bytes = linelength = 0;/* If in the current locale, chars are equivalent to bytes, we prefer counting bytes, because that's easier. */#if MB_LEN_MAX > 1if (MB_CUR_MAX > 1){count_bytes = print_bytes;count_chars = print_chars;}else#endif{count_bytes = print_bytes || print_chars;count_chars = false;}count_complicated = print_words || print_linelength;/* When counting only bytes, save some line- and word-counting overhead. If FD is a `regular' Unix file, using lseek is enoughto get its `size' in bytes. Otherwise, read blocks of BUFFER_SIZEbytes at a time until EOF. Note that the `size' (number of bytes)that wc reports is smaller than stats.st_size when the file is notpositioned at its beginning. That's why the lseek calls below arenecessary. For example the command`(dd ibs=99k skip=1 count=0; ./wc -c) < /etc/group'should make wc report `0' bytes. */if (count_bytes && !count_chars && !print_lines && !count_complicated) {off_t current_pos, end_pos;if (0 < fstatus->failed)fstatus->failed = fstat (fd, &fstatus->st);if (! fstatus->failed && S_ISREG (fstatus->st.st_mode)&& (current_pos = lseek (fd, (off_t) 0, SEEK_CUR)) != -1&& (end_pos = lseek (fd, (off_t) 0, SEEK_END)) != -1){/* Be careful here. The current position may actually bebeyond the end of the file. As in the example above. */ bytes = end_pos < current_pos ? 0 : end_pos - current_pos;}else{while ((bytes_read = safe_read (fd, buf, BUFFER_SIZE)) > 0){if (bytes_read == SAFE_READ_ERROR){error (0, errno, "%s", file);ok = false;break;}bytes += bytes_read;}}}else if (!count_chars && !count_complicated){/* Use a separate loop when counting only lines or lines and bytes -- but not chars or words. */while ((bytes_read = safe_read (fd, buf, BUFFER_SIZE)) > 0){char *p = buf;if (bytes_read == SAFE_READ_ERROR){error (0, errno, "%s", file);ok = false;break;}while ((p = memchr (p, '\n', (buf + bytes_read) - p))){++p;++lines;}bytes += bytes_read;}}#if MB_LEN_MAX > 1# define SUPPORT_OLD_MBRTOWC 1else if (MB_CUR_MAX > 1){bool in_word = false;uintmax_t linepos = 0;DECLARE_ZEROED_AGGREGATE (mbstate_t, state);bool in_shift = false;# if SUPPORT_OLD_MBRTOWC/* Back-up the state before each multibyte character conversion and move the last incomplete character of the buffer to the frontof the buffer. This is needed because we don't know whetherthe `mbrtowc' function updates the state when it returns -2, -this is the ISO C 99 and glibc-2.2 behaviour - or not - amendedANSI C, glibc-2.1 and Solaris 5.7 behaviour. We don't have anautoconf test for this, yet. */size_t prev = 0; /* number of bytes carried over from previous round */ # elseconst size_t prev = 0;# endifwhile ((bytes_read = safe_read (fd, buf + prev, BUFFER_SIZE - prev)) > 0){const char *p;# if SUPPORT_OLD_MBRTOWCmbstate_t backup_state;# endifif (bytes_read == SAFE_READ_ERROR){error (0, errno, "%s", file);ok = false;break;}bytes += bytes_read;p = buf;bytes_read += prev;do{wchar_t wide_char;size_t n;if (!in_shift && is_basic (*p)){/* Handle most ASCII characters quickly, without callingmbrtowc(). */n = 1;wide_char = *p;}else{in_shift = true;# if SUPPORT_OLD_MBRTOWCbackup_state = state;# endifn = mbrtowc (&wide_char, p, bytes_read, &state);if (n == (size_t) -2){# if SUPPORT_OLD_MBRTOWCstate = backup_state;# endifbreak;}if (n == (size_t) -1){/* Remember that we read a byte, but don't complainabout the error. Because of the decoding error,this is a considered to be byte but not acharacter (that is, chars is not incremented). */p++;bytes_read--;continue;}if (mbsinit (&state))in_shift = false;if (n == 0){wide_char = 0;n = 1;}}p += n;bytes_read -= n;chars++;switch (wide_char){case '\n':lines++;/* Fall through. */case '\r':case '\f':if (linepos > linelength)linelength = linepos;linepos = 0;goto mb_word_separator;case '\t':linepos += 8 - (linepos % 8);goto mb_word_separator;case ' ':linepos++;/* Fall through. */case '\v':mb_word_separator:words += in_word;in_word = false;break;default:if (iswprint (wide_char)){int width = wcwidth (wide_char);if (width > 0)linepos += width;if (iswspace (wide_char))goto mb_word_separator;in_word = true;}break;}}while (bytes_read > 0);# if SUPPORT_OLD_MBRTOWCif (bytes_read > 0){if (bytes_read == BUFFER_SIZE){/* Encountered a very long redundant shift sequence. */p++;bytes_read--;}memmove (buf, p, bytes_read);}prev = bytes_read;# endif}if (linepos > linelength)linelength = linepos;words += in_word;}#endifelse{bool in_word = false;uintmax_t linepos = 0;while ((bytes_read = safe_read (fd, buf, BUFFER_SIZE)) > 0) {const char *p = buf;if (bytes_read == SAFE_READ_ERROR){error (0, errno, "%s", file);ok = false;break;}bytes += bytes_read;do{switch (*p++){case '\n':lines++;/* Fall through. */case '\r':case '\f':if (linepos > linelength)linelength = linepos;linepos = 0;goto word_separator;case '\t':linepos += 8 - (linepos % 8);goto word_separator;case ' ':linepos++;/* Fall through. */case '\v':word_separator:words += in_word;in_word = false;break;default:if (isprint (to_uchar (p[-1]))){linepos++;if (isspace (to_uchar (p[-1])))goto word_separator;in_word = true;}break;}}while (--bytes_read);}if (linepos > linelength)linelength = linepos;words += in_word;}if (count_chars < print_chars)chars = bytes;write_counts (lines, words, chars, bytes, linelength, file_x); total_lines += lines;total_words += words;total_chars += chars;total_bytes += bytes;if (linelength > max_line_length)max_line_length = linelength;return ok;}static boolwc_file (char const *file, struct fstatus *fstatus){if (! file || STREQ (file, "-")){have_read_stdin = true;if (O_BINARY && ! isatty (STDIN_FILENO))xfreopen (NULL, "rb", stdin);return wc (STDIN_FILENO, file, fstatus);}else{int fd = open (file, O_RDONLY | O_BINARY);if (fd == -1){error (0, errno, "%s", file);return false;}else{bool ok = wc (fd, file, fstatus);if (close (fd) != 0){error (0, errno, "%s", file);return false;}return ok;}}}/* Return the file status for the NFILES files addressed by FILE.Optimize the case where only one number is printed, for just onefile; in that case we can use a print width of 1, so we don't needto stat the file. Handle the case of (nfiles == 0) in the same way;that happens when we don't know how long the list of file names will be. */ static struct fstatus *get_input_fstatus (int nfiles, char *const *file){struct fstatus *fstatus = xnmalloc (nfiles ? nfiles : 1, sizeof *fstatus);if (nfiles == 0|| (nfiles == 1&& ((print_lines + print_words + print_chars+ print_bytes + print_linelength)== 1)))fstatus[0].failed = 1;else{int i;for (i = 0; i < nfiles; i++)fstatus[i].failed = (! file[i] || STREQ (file[i], "-")? fstat (STDIN_FILENO, &fstatus[i].st): stat (file[i], &fstatus[i].st));}return fstatus;}/* Return a print width suitable for the NFILES files whose status is recorded in FSTATUS. Optimize the same special case thatget_input_fstatus optimizes. */static intcompute_number_width (int nfiles, struct fstatus const *fstatus) {int width = 1;if (0 < nfiles && fstatus[0].failed <= 0){int minimum_width = 1;uintmax_t regular_total = 0;int i;for (i = 0; i < nfiles; i++)if (! fstatus[i].failed){if (S_ISREG (fstatus[i].st.st_mode))regular_total += fstatus[i].st.st_size;elseminimum_width = 7;}for (; 10 <= regular_total; regular_total /= 10)width++;if (width < minimum_width)width = minimum_width;}return width;}intmain (int argc, char **argv){bool ok;int optc;int nfiles;char **files;char *files_from = NULL;struct fstatus *fstatus;struct Tokens tok;initialize_main (&argc, &argv);set_program_name (argv[0]);setlocale (LC_ALL, "");bindtextdomain (PACKAGE, LOCALEDIR);textdomain (PACKAGE);atexit (close_stdout);/* Line buffer stdout to ensure lines are written atomically and immediately so that processes running in parallel do not intersperse their output. */ setvbuf (stdout, NULL, _IOLBF, 0);print_lines = print_words = print_chars = print_bytes = false;print_linelength = false;total_lines = total_words = total_chars = total_bytes = max_line_length = 0; while ((optc = getopt_long (argc, argv, "clLmw", longopts, NULL)) != -1) switch (optc){case 'c':print_bytes = true;break;case 'm':print_chars = true;break;case 'l':print_lines = true;break;case 'w':print_words = true;break;case 'L':print_linelength = true;break;case FILES0_FROM_OPTION:files_from = optarg;break;case_GETOPT_HELP_CHAR;case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);default:usage (EXIT_FAILURE);}if (! (print_lines || print_words || print_chars || print_bytes|| print_linelength))print_lines = print_words = print_bytes = true;bool read_tokens = false;struct argv_iterator *ai;if (files_from){FILE *stream;/* When using --files0-from=F, you may not specify any fileson the command-line. */if (optind < argc){error (0, 0, _("extra operand %s"), quote (argv[optind]));fprintf (stderr, "%s\n",_("file operands cannot be combined with --files0-from"));usage (EXIT_FAILURE);}if (STREQ (files_from, "-"))stream = stdin;else{stream = fopen (files_from, "r");if (stream == NULL)error (EXIT_FAILURE, errno, _("cannot open %s for reading"),quote (files_from));}/* Read the file list into RAM if we can detect its size and thatsize is reasonable. Otherwise, we'll read a name at a time. */ struct stat st;if (fstat (fileno (stream), &st) == 0&& S_ISREG (st.st_mode)&& st.st_size <= MIN (10 * 1024 * 1024, physmem_available () / 2)){read_tokens = true;readtokens0_init (&tok);if (! readtokens0 (stream, &tok) || fclose (stream) != 0)error (EXIT_FAILURE, 0, _("cannot read file names from %s"),quote (files_from));files = tok.tok;nfiles = tok.n_tok;ai = argv_iter_init_argv (files);}else{files = NULL;nfiles = 0;ai = argv_iter_init_stream (stream);}}else{static char *stdin_only[] = { NULL };files = (optind < argc ? argv + optind : stdin_only);nfiles = (optind < argc ? argc - optind : 1);ai = argv_iter_init_argv (files);}fstatus = get_input_fstatus (nfiles, files);number_width = compute_number_width (nfiles, fstatus);int i;ok = true;for (i = 0; /* */; i++){bool skip_file = false;enum argv_iter_err ai_err;char *file_name = argv_iter (ai, &ai_err);if (ai_err == AI_ERR_EOF)break;if (!file_name){switch (ai_err){case AI_ERR_READ:error (0, errno, _("%s: read error"), quote (files_from));skip_file = true;continue;case AI_ERR_MEM:xalloc_die ();default:assert (!"unexpected error code from argv_iter");}}if (files_from && STREQ (files_from, "-") && STREQ (file_name, "-")){/* Give a better diagnostic in an unusual case:printf - | wc --files0-from=- */error (0, 0, _("when reading file names from stdin, ""no file name of %s allowed"),quote (file_name));skip_file = true;}if (!file_name[0]){/* Diagnose a zero-length file name. When it's oneamong many, knowing the record number may help.FIXME: currently print the record number only with--files0-from=FILE. Maybe do it for argv, too? */if (files_from == NULL)error (0, 0, "%s", _("invalid zero-length file name"));else{/* Using the standard `filename:line-number:' prefix here isnot totally appropriate, since NUL is the separator, not NL,but it might be better than nothing. */unsigned long int file_number = argv_iter_n_args (ai);error (0, 0, "%s:%lu: %s", quotearg_colon (files_from),file_number, _("invalid zero-length file name"));}skip_file = true;}if (skip_file)ok = false;elseok &= wc_file (file_name, &fstatus[nfiles ? i : 0]);}/* No arguments on the command line is fine. That means read from stdin.However, no arguments on the --files0-from input stream is an error means don't read anything. */if (ok && !files_from && argv_iter_n_args (ai) == 0)ok &= wc_file (NULL, &fstatus[0]);if (read_tokens)readtokens0_free (&tok);if (1 < argv_iter_n_args (ai))write_counts (total_lines, total_words, total_chars, total_bytes,max_line_length, _("total"));argv_iter_free (ai);free (fstatus);if (have_read_stdin && close (STDIN_FILENO) != 0)error (EXIT_FAILURE, errno, "-");exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);}。