cat, grep, awk 및 sed 명령을 결합하는 방법은 무엇입니까?

cat, grep, awk 및 sed 명령을 결합하는 방법은 무엇입니까?

이러한 명령을 개별적으로 입력하면 원하는 결과를 얻을 수 있습니다.

cat /var/log/apt/history.log | grep 'apt install' > installation.txt
grep -v "nvidia" installation.txt > tmpfile && mv tmpfile installation.txt
awk -F"ll " '{print $2}' installation.txt > temp1
sed -n '/--/!p' temp1 > temp2
sed -n '/-f/!p' temp2 > installation.txt

그런데 이걸 어떻게 조합해야 할지 모르겠네요...

다음은 처음에 무엇이 잘못되었는지 이해하기 위해 NVIDIA 검색 없이 실행한 몇 가지 테스트입니다.

cat /var/log/apt/history.log | grep 'apt install' > file | awk -F"ll " '{print $2}' file > temp | sed -n '/--/!p' temp > file | sed -n '/-f/!p' file > installation.txt
cat /var/log/apt/history.log | grep 'apt install' > file | awk -F"ll " '{print $2}' file | awk -F"ll " '{print $2}' file | sed -n '/--/!p' file | sed -n '/-f/!p' file
cat /var/log/apt/history.log | grep 'apt install' > file | awk -F"ll " '{print $2}' file > temp | sed -n '/--/!p' temp > file | sed -n '/-f/!p' file > installation.txt

이러한 작업을 어떻게 결합합니까?

설치된 패키지를 내보내고 내가 만든 스크립트에 해당 기능을 포함하고 싶습니다.github에서 찾을 수 있습니다.

내에서 이 명령을 사용해야 합니다.package.sh스크립트.

답변1

지금까지의 답변은 모두 훌륭하며 귀하가 원하는 작업을 다루고 있습니다. 내 대답은 쉘 명령에 대한 이해(또는 오해)에 관한 것입니다.

cat /var/log/apt/history.log | grep 'apt install' > file 파일을 읽고 cat출력 할 수 있습니다 . 그럴 필요 는 grep없으며 파일 자체를 읽을 수 있습니다.catgrep

> file | awk둘째, 단계에 그런 것이 있습니다 grep. 그게 무엇을 해야 할지 잘 모르겠습니다. > file방법"파일로 직접 출력(터미널에 덤프하는 대신)"하지만 | awk수단은"출력을 캡처하여 다음으로 보냅니다.awk". 두 가지를 동시에 할 수는 없을 것 같습니다. ( tee입력 복사본을 두 대상 모두에 보내는 명령이 있지만 여기서는 수행하는 작업이 아닙니다.)

답변2

모든 것이 다음과 같이 하나의 명령으로 결합됩니다 awk.

awk -F'll ' '
  /apt install/ && !/nvidia|-[-f]/{ print $2 }
' /var/log/apt/history.log >installation.txt

답변3

Commandline:기록 항목에서 설치된 패키지 이름을 추출(및 필터링)하는 또 다른 방법은 apt단일 sed명령을 사용하는 것입니다.

sed -e '/^Commandline: apt install /!d' -e 's///' \
    -e '/nvidia/d' -e '/--/d' -e '/-f/d' \
    </var/log/apt/history.log >installation.txt

두 표현식의 첫 번째 줄은 먼저 string 으로 시작하지 않는 모든 입력 줄을 제거한 Commandline: apt install다음 string으로 시작하는 줄에서 해당 문자열을 제거합니다.

nvidia두 번째 줄에는 세 개의 문자열 또는 --중 하나가 포함된 줄을 삭제하는 일련의 표현식이 포함되어 있습니다 -f.

세 번째 줄에는 입력 및 출력 리디렉션이 포함되어 있습니다.


시스템에 수동으로 설치된 패키지를 나열하는 또 다른 방법은 다음을 사용하는 것입니다.

apt list --installed | sed -e '/automatic/d' -e 's,/.*,,'

...목록에서 자동 종속성으로 설치된 모든 패키지를 제거하는 동시에 설치된 모든 패키지를 나열합니다(이 투박한 명령은 atuomatic이름에 해당 문자열이 포함된 모든 패키지도 제거합니다).

관련 정보