grep command simulation - Programmers Heaven

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

grep command simulation

how to simulate the grep -l option of unix in c.
where the command line argument passed as below:
grep -l [pattern] [file name(where to be searched)]

Comments

  • nugentnugent Posts: 87Member
    : how to simulate the grep -l option of unix in c.
    : where the command line argument passed as below:
    : grep -l [pattern] [file name(where to be searched)]
    :

    compile this code and run as follows

    prog_name word_to_be_found list of files to search in

    notes:
    - search is case sensitive
    - does not do recursive search (you can easily add this useing either the ftw() or nftw() functions to walk a directory tree)
    - does not accept regular expression (look into glibc regular expressions or the perl compatible regular expression (PCRE) libraries f you want to add this)
    - loads entire file into memory, so be careful not to search large files


    [code]
    #include
    #include
    #include
    #include

    /* calculate filesize */
    int calc_bufsize(char *filename)
    {
    struct stat st;

    stat(filename, &st);
    return ((int)st.st_size);
    }

    int main(int argc, char *argv[])
    {
    if(argc < 3)
    {
    printf("Usage:
    %s ...
    ", argv[0]);
    return -1;
    }

    FILE *fp;
    char *filename;
    int x = 2;

    /* process each file */
    for(x; x != argc; x++)
    {
    filename = argv[x];

    if( (fp = fopen(filename, "r")) == NULL)
    {
    printf("Failed to open file: %s
    ", argv[2]);
    return -2;
    }

    int BUFSIZE = calc_bufsize(filename);

    /* read ENTIRE file into buf[] */
    char buf[BUFSIZE];
    fread(&buf, sizeof(char), BUFSIZE, fp);

    /* search buf for word (case sensitive) */
    char *ans = strstr(buf, argv[1]);

    /* word found, print filename */
    if(ans != NULL)
    printf("%s
    ", filename);

    /* word not found, do nothing */

    fclose(fp);
    }
    return 0;
    }
    [/code]

    ------
    nugent



  • anandkumarrs6anandkumarrs6 Posts: 1Member
    Can you help me with a sample output for this program ....

  • ganeshceceganeshcece Posts: 1Member
    #include
    #include
    int main(int argc, char *argv[])
    {
    FILE *fp;
    /*without option*/
    if(argc==3)
    {
    printf("
    Lines with the search string
    ");
    fp=fopen(argv[2],"r");
    char search[100],string[100];
    strcpy(search,argv[1]);
    while(!feof(fp))
    {
    fgets(string,sizeof(string),fp);
    if(strstr(string,search)!=NULL)
    printf("%s",string);
    }
    fclose(fp);
    }
    /*options included*/
    else if(argc==4)
    {
    /*option -n included*/
    if(argv[1][1]=='n')
    {
    printf("
    Line Numbering
    ");
    fp=fopen(argv[3],"r");
    char search[100],string[100];
    int i=1;
    strcpy(search,argv[2]);
    while(!feof(fp))
    {
    fgets(string,sizeof(string),fp);
    if(strstr(string,search)!=NULL)
    printf("%d --> %s",i,string);
    i++;
    }
    fclose(fp);
    }

    /*option -v included*/
    else if(argv[1][1]=='v')
    {
    printf("
    Lines without the search string
    ");
    fp=fopen(argv[3],"r");
    char search[100],string[100];
    strcpy(search,argv[2]);
    while(!feof(fp))
    {
    fgets(string,sizeof(string),fp);
    if(strstr(string,search)==NULL)
    printf("%s",string);
    }
    printf("
    ");
    fclose(fp);
    }
    /*option -c included*/
    else if(argv[1][1]=='c')
    {
    printf("
    Number of lines with the search string
    ");
    fp=fopen(argv[3],"r");
    char search[100],string[100];
    int i=0;
    strcpy(search,argv[2]);
    while(!feof(fp))
    {
    fgets(string,sizeof(string),fp);
    if(strstr(string,search)!=NULL)
    i++;
    }
    printf("%d
    ",i);
    fclose(fp);
    }
    /*option -x included*/
    else if(argv[1][1]=='x')
    {
    printf("
    Lines with the search string alone
    ");
    fp=fopen(argv[3],"r");
    char search[100],string[100];
    strcpy(search,argv[2]);
    search[strlen(search)]='
    ';
    while(!feof(fp))
    {
    fgets(string,sizeof(string),fp);
    if(strcmp(search,string)==0)
    printf("%s",string);
    }
    fclose(fp);
    }
    /*option -i included*/
    else if(argv[1][1]=='i')
    {
    printf("
    Lines with the search string - case insensitive
    ");
    fp=fopen(argv[3],"r");
    char search[100],string[100],search_lwr[100],string_lwr[100];
    int j;
    strcpy(search,argv[2]);
    for(j=0;search[j];j++)
    search_lwr[j]=tolower(search[j]);
    search_lwr[strlen(search)]='';
    while(!feof(fp))
    {
    fgets(string,sizeof(string),fp);
    for(j=0;string[j];j++)
    string_lwr[j]=tolower(string[j]);
    string_lwr[strlen(string)]='';
    if(strstr(string_lwr,search_lwr)!=NULL)
    printf("%s",string_lwr);
    }
    fclose(fp);
    }
    }
    else
    printf("
    Error in input");
    }

    and another one is


    Code
    /* Program for grep command with options
Sign In or Register to comment.