Kunde inte hålla mig utan hackade ihop ett litet C-program, orkade inte trassla med awk och bash... Det är lite "quick 'n dirty" med shell-kommandon via system(), men det funkar...
Kopiera och spara i t.ex "clinks.c" (för "Count links").
Kod: Markera allt
#define __USE_GNU
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
main(int argc,char *argv[])
{
int i,j;
char buf[255],buf2[255],cmd[255],*_ptr,*_ptr2;
FILE *_fp,*_fp2;
extern char *strcasestr (__const char *__haystack, __const char *__needle);
sprintf(cmd,"cat %s > alla_filer",argv[1]);
system(cmd);
if ((_fp=fopen("alla_filer","r")) == NULL){
perror("Failed to open file-listing");
exit(errno);
}
if ((_fp2=fopen("alla_filer2","w")) == NULL){
perror("Failed to open sort-file");
exit(errno);
}
while (fgets(buf,sizeof(buf),_fp) != NULL){
if(strlen(buf)>0){
if ((_ptr=strcasestr(buf,"href")) != NULL){
if ((_ptr=strcasestr(buf,"https")) != NULL){
j=8;
}else{
j=7;
_ptr=strcasestr(buf,"http");
}
if (_ptr != NULL){
_ptr+=j;
if ((_ptr2=strcasestr(_ptr,">")) != NULL){
*_ptr2=0;
if ((_ptr2=strcasestr(_ptr,"\"")) != NULL){
*_ptr2=0;
}
_ptr2--;
if (*_ptr2=='/'){
*_ptr2=0;
}
fprintf(_fp2,"%s\n",_ptr);
/*
while(*_ptr){
printf("%c",*_ptr);
_ptr++;
}
*/
/* printf("\n"); */
}
}
}
}
}
fclose(_fp);
fclose(_fp2);
sprintf(cmd,"sort alla_filer2 > alla_filer3");
system(cmd);
if ((_fp=fopen("alla_filer3","r")) == NULL){
perror("Failed to open sorted file-listing");
exit(errno);
}
if ((_fp2=fopen("alla_filer4","w")) == NULL){
perror("Failed to open result file");
exit(errno);
}
i=0; buf2[0]=0;
while (fgets(buf,sizeof(buf),_fp) != NULL){
i++;
if ((strcmp(buf,buf2)!=0)&&(strlen(buf2)!=0)){
fprintf(_fp2,"%04d,%s",i,buf2);
j=i;
i=0;
}
strcpy(buf2,buf);
}
fprintf(_fp2,"%04d,%s",j,buf2);
fclose(_fp);
fclose(_fp2);
sprintf(cmd,"sort -rf alla_filer4 > alla_filer5");
sprintf(cmd,"sort -rnk1 alla_filer4 > alla_filer5");
sprintf(cmd,"sort -t, -k1,4rn -k2 alla_filer4 | sed -e 's/,/ /g' > alla_filer5");
system(cmd);
if ((_fp=fopen("alla_filer5","r")) == NULL){
perror("Failed to open sorted result file");
exit(errno);
}
/*
if ((_fp2=fopen("alla_filer6","w")) == NULL){
perror("Failed to open formatted result file");
exit(errno);
}
*/
while (fgets(buf,sizeof(buf),_fp) != NULL){
_ptr=buf;
while(*_ptr=='0'){
*_ptr=0x020;
_ptr++;
}
printf("%s",buf);
}
fclose(_fp);
sprintf(cmd,"rm alla_filer alla_filer2 alla_filer3 alla_filer4 alla_filer5");
system(cmd);
}
Bygg med:
Och kör med:
Efter som det är ett snabbhack så är parameterhanteringen rätt enkel, det klarar av en enda fil, eller flera filer med wildcard. Om du vill ange wildcard måste du ha en backslash innan, t.ex "clinks \*.html", eller "clinks a\*.html"...
Jag har testat det och det funkar fint för både http- och https-länkar etc. plus lite annat när det gäller olika syntax för samma länk, men det kan finnas buggar kvar...
Testa, ändra och fixa så att det blir som du vill ha det...
[Edit] Givetvis kan du kopiera det kompilerade programmet till /bin, /usr/bin, /usr/local/bin eller vad du nu vill så att du kan köra det som ett kommando.