linux下自实现简易tail命令

/*
    浏览单个文件,按行或者按字节
    格式: tail filename c/n num,目前不支持其他格式
*/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
/*
    错误处理
*/
void oops(char *s1, char* s2)
{
    fprintf(stderr, "Error:%s", s1);
    perror(s2);
    exit(1);
}

/*
    按字节输出,name打开文件名,命令行字节数
*/
void print_c(char* name, int num)
{
    char buf[200];
    int fd, n;
    long size;
    
    fd = open(name, O_RDONLY);
    if (fd == -1)
        oops("can‘t open", name);
    size = lseek(fd, 0, SEEK_END);
    if (num < 0) 
        if (-num >= size)
            lseek(fd, 0, SEEK_SET);
        else
            lseek(fd, num, SEEK_END);
    else if (num >= size)
        lseek(fd, 0, SEEK_END);
    else
        lseek(fd, num, SEEK_SET);
    while (( n = read(fd, buf, 200)) > 0)
        if (write(STDOUT_FILENO, buf, n) != n)
            oops("write failed", "stdout");
    if (n == -1)
        oops("read failed", "input");
    close(fd);
}
/*
    按行输出,name文件名,num命令行行数
    按行输出,方法效率较低,先遍历文件统计所以行数,再确定输出位置
*/
void print_n(char *name, int num)
{
    char buf[200]; 
    FILE *fp;
    int n = 0;
    fp = fopen(name, "r");
    while (fgets(buf, 200, fp) != NULL)
        n++;
    rewind(fp);
    if (num < 0)
        num = n + num;
    if (num < 0)
        num = 0;
    while(num--)
        fgets(buf, 200, fp);
    while (1) {
        if (fgets(buf, 200, fp) == NULL)
            break;
        if (fputs(buf, stdout) == EOF)
            oops("write failed", "stdout");
    }
    fclose(fp);
}

int main(int argc, char* argv[])
{
    int num;
    FILE *fp;
    char cmd;
    if (argc < 3) {
        fprintf(stderr, "tail01: missing operand");
        exit(1);
    }
    if (argv[2][0] == ‘c‘ || argv[2][0] == ‘n‘)
        cmd = argv[2][0];
    else {
        fprintf(stderr, "operand error");
        exit(1);
    }
    num = atoi(argv[3]);
    if (argv[3][0] != ‘+‘&&argv[3][0] != ‘-‘)
        num = -num;
    switch(cmd) {
        case ‘c‘:
            print_c(argv[1], num);
            break;
        case ‘n‘:
            print_n(argv[1], num);
            break;            
        default:
            fprintf(stderr, "switch eror");
            exit(1);
    }
}

总结:

目前未实现其他功能

时间: 2024-10-02 21:48:45

linux下自实现简易tail命令的相关文章

Linux下常见的文本处理命令

众所周知,在Linux下"一切皆文件"的原则,一切配置文件都可以以文本的方式进行编辑.存储.故对文本文件的操作能力,决定着你是否能够在Linux下操纵自如.今天,就写下几个关于Linux下一些常用的文本处理命令. 1.文本文件查看命令:cat.more.less.head.tail 1.1 cat命令:连接并显示,当文本文件有多个时,将其连接并一个一个的完整地显示出来 eg: cat /etc/inittab cat /etc/fstab cat /etc/inittab /etc/f

Linux下几种文件传输命令

Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性.在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作).Sftp与ftp虽然只有一字之差,但基于

linux下常用的日志分析命令

linux下常用的日志分析命令 本文介绍下,在linux中常用的一些分析日志的命令行或脚本,有需要的朋友参考下. 形如下面这样的access.log日志内容: 211.123.23.133 – - [10/Dec/2010:09:31:17 +0800] “GET /query/trendxml/district/todayreturn/month/2009-12-14/2010-12-09/haizhu_tianhe.xml HTTP/1.1″ 200 1933 “-” “Mozilla/5.

rlwrap: command not found和解决linux下sqlplus 提供浏览历史命令行的功能

rlwrap工具可以解决linux下sqlplus 提供浏览历史命令行的功能,和删除先前输入错误的字母等问题 1.安装 需要readline包 这个安装光盘就有 [[email protected] RedHat]# cd RPMS/[[email protected] RPMS]# rpm -Uvh readline*warning: readline-4.3-13.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60eerror: Failed

linux下的find文件查找命令与grep文件内容查找命令

linux下的find文件查找命令与grep文件内容查找命令 在使用linux时,经常需要进行文件查找.其中查找的命令主要有find和grep.两个命令是有区的. 区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等. (2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找. 一.find命令 基本格式:find  path expression 1.按照文件名查找 (1)find / -

[原创] Linux下几种文件传输命令 sz rz sftp scp介绍

Linux下几种文件传输命令 sz rz sftp scp介绍 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性.在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作).Sftp与ftp虽然只有一字之差,但基于的传输协议却是不同的.因此不能用sftp client去连

Linux下压缩与解压命令tar

tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思): -x :解开一个压缩文件的参数指令! -t :查看 tarfile 里面的文件! 特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在! 因为不可能同时压缩与解压缩. -z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩? -j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩? -v :压缩的过程中显示文件!这个常用

Linux下的文件夹创建命令使用实践

[文章摘要] 本文以实际的C源程序为样例,介绍了Linux下的文件夹创建命令(mkdir)的用法.为相关开发工作的开展提供了故意的參考. [关键词] C语言  Linux  文件夹创建  makefile  开发 一.mkdir命令简单介绍 mkdir命令用来创建指定名称的文件夹,其命令格式为:mkdir [选项] 文件夹... 当中,[选项]能够是"-m"."-p"或"-v". 此外,文件夹名是区分大写和小写的. 二.本程序流程 本文中的程序用

linux下维护服务器之常用命令

linux下维护服务器之常用命令! 第1套如下: 正则表达式: 1.如何不要文件中的空白行和注释语句: [[email protected] ~]# grep -v '^$' 文件名 |grep -v '^#' 2.如何查阅系统上面正在运作当中的程序呢? 利用静态的 ps 或者是动态的top,还能以 pstree 来查阅程序树之间的关系! 一个是叧能查阅自己 bash 程序癿『 ps -l 』一个则是可以查阅 所有系统运作癿程序『 ps aux 』 [[email protected] ~]#